const在c与c++中的不同地位
2016-07-01 00:04
225 查看
我们都知道,const关键字是防止某个变量被修改的,即限定这个变量是只读的。C/C++中应用const会使程序的健壮性更高一些。
一、const修饰一般变量
在C中,const修饰一般变量是常变量,它具有变量属性,但同时,它又具有常性不可被修改。
在C++中,加const修饰以后变量就是个常量,不可被修改。
二、const修饰指针变量
先回想一下我们以前在C中写一段代码时传参的方式有传值和传址两种,但是大家也都知道传值的方式就是在函数内部做了一份临时拷贝,但出了这个函数的作用域临时变量就会被销毁。而利用指针传址的方式又不安全,例如下面这段代码:
这样,即便是一个简单的输出函数也会变得不安全,因此我们会加const使其变为安全的:
在c/c++中,const修饰指针变量时需要考虑const的位置:
这时就应该弄清楚一个概念:指针常量和常量指针
(1)常量指针:中心词是指针,用常量来修饰指针,其本质是一个指针,说明这个指针是一个指向常量的指针,即指针本身是可以修改的,但指针指向的变量不可修改
(2)指针常量:中心词是常量,用指针修饰,本质是一个常量,说明这个常量的值应该是一个指针,即指针本身的值是不能改变的,而通过指针指向的变量的值是可以改变的
C++中的const引用:
1.引用一个常量时,必须用const修饰——常量不可被修改
2.const修饰一个变量时:(先看一段错误代码)
refn作为n的引用,二者用的是同一个空间,按理来说,这一块空间只具有一个安全属性,要么是安全的要么是不安全的。但是从上边代码来看,n加了const保护不可被修改,但refn不具有安全属性,即它所代表的空间内容可被修改,这样就产生了矛盾。因此,要想refn称为n的引用,这里必须加上const保护。即:const int& refn = n;
3.const修饰一个引用时可以对该变量加以保护
4.const修饰全局变量,不一定会为其开辟空间。
const修饰全局变量,不一定会为其开辟空间。如果不对n进行直接的操作,那么n这块空间是还没被开辟的,这时候const的作用和#define一样,在程序中仅仅只是替换n。只有在需要使用n所属的空间时系统才会开辟一块空间出来,因此,上边代码中的&n操作就会出现错误。(和底下这段代码作比较)
这段代码中需要用p指针指向n的这块空间的地址,编译器为其开辟了空间
5.引用的类型与已定义的变量类型不同
//这段代码是错误的
//这段代码在编译时只产生警告
从上边两端代码看得出,仅仅只有一个const之差,那么为什么会产生这样的差异呢?!我们接下来分析一下:
通过调试我们可以发现,d1和d2用的并不是同一块空间,说明d2根本就不是d1的引用。在这里其实是有一些变化的,当int类型的d2要作为double类型的d1的引用时,由于两者类型不同,会根据d1产生一个int类型的临时变量(匿名变量),而d2是这个临时变量的引用。临时变量一般是不能被修改的,因此在这里加了const。
因此,以后在变量与该变量的引用之间有类型变化时一定要加const修饰。
一、const修饰一般变量
在C中,const修饰一般变量是常变量,它具有变量属性,但同时,它又具有常性不可被修改。
在C++中,加const修饰以后变量就是个常量,不可被修改。
二、const修饰指针变量
先回想一下我们以前在C中写一段代码时传参的方式有传值和传址两种,但是大家也都知道传值的方式就是在函数内部做了一份临时拷贝,但出了这个函数的作用域临时变量就会被销毁。而利用指针传址的方式又不安全,例如下面这段代码:
//传址方式-----不安全 void print2(int *pa) { *pa = 20; //a的值会发生改变 cout<<*pa<<endl; //输出为20 } int main() { int a = 10; print2(&a); system("pause"); return 0; }
这样,即便是一个简单的输出函数也会变得不安全,因此我们会加const使其变为安全的:
void print2(const int *pa) //注意这块的const一定在*左边而不是在*右边,*放在右边修饰的是a,说明这个a是不能被修改的 { cout<<*pa<<endl; }
在c/c++中,const修饰指针变量时需要考虑const的位置:
这时就应该弄清楚一个概念:指针常量和常量指针
(1)常量指针:中心词是指针,用常量来修饰指针,其本质是一个指针,说明这个指针是一个指向常量的指针,即指针本身是可以修改的,但指针指向的变量不可修改
(2)指针常量:中心词是常量,用指针修饰,本质是一个常量,说明这个常量的值应该是一个指针,即指针本身的值是不能改变的,而通过指针指向的变量的值是可以改变的
int a = 1; int b = 3; const int *p = &a;//常量指针 int const *p = &a;//常量指针 int* const p = &a;//指针常量
C++中的const引用:
1.引用一个常量时,必须用const修饰——常量不可被修改
#include<iostream> #include<cstdlib> //在.cpp文件中使用.h头文件时,前边加上c并去掉.h using namespace std; int main() { const int &refn = 5; return 0; }
2.const修饰一个变量时:(先看一段错误代码)
int main() { const int n = 10; int &refn = n; return 0; }
refn作为n的引用,二者用的是同一个空间,按理来说,这一块空间只具有一个安全属性,要么是安全的要么是不安全的。但是从上边代码来看,n加了const保护不可被修改,但refn不具有安全属性,即它所代表的空间内容可被修改,这样就产生了矛盾。因此,要想refn称为n的引用,这里必须加上const保护。即:const int& refn = n;
3.const修饰一个引用时可以对该变量加以保护
int main() { int a = 0; const int &refa = a; refa = 10; //欲通过refa来改变a的值, system("pause"); return 0 ; }引用加了const保护从而使a的这块空间不会被改变,增加了其安全属性。因此我们也可以将引用作为参数(由于不需要拷贝一份临时变量,效率会高一些):
//引用传参 void print3(const int &refa) { cout<<refa<<endl; } int main() { int a = 10; print3(a); system("pause"); return 0; }
4.const修饰全局变量,不一定会为其开辟空间。
const修饰全局变量,不一定会为其开辟空间。如果不对n进行直接的操作,那么n这块空间是还没被开辟的,这时候const的作用和#define一样,在程序中仅仅只是替换n。只有在需要使用n所属的空间时系统才会开辟一块空间出来,因此,上边代码中的&n操作就会出现错误。(和底下这段代码作比较)
这段代码中需要用p指针指向n的这块空间的地址,编译器为其开辟了空间
5.引用的类型与已定义的变量类型不同
//这段代码是错误的
int main() { double d1 = 1.2; int &d2 = d1; system("pause"); return 0 ; }
//这段代码在编译时只产生警告
int main() { double d1 = 1.2; const int &refd2 = d1; system("pause"); return 0 ; }
从上边两端代码看得出,仅仅只有一个const之差,那么为什么会产生这样的差异呢?!我们接下来分析一下:
通过调试我们可以发现,d1和d2用的并不是同一块空间,说明d2根本就不是d1的引用。在这里其实是有一些变化的,当int类型的d2要作为double类型的d1的引用时,由于两者类型不同,会根据d1产生一个int类型的临时变量(匿名变量),而d2是这个临时变量的引用。临时变量一般是不能被修改的,因此在这里加了const。
因此,以后在变量与该变量的引用之间有类型变化时一定要加const修饰。
相关文章推荐
- C++中const的用法详细总结
- C++中const用法小结
- C++中的const和constexpr详解
- 详解C++中的const关键字及与C语言中const的区别
- C++ 中const和复合类型
- c++中const的使用详解
- C语言基础知识点解析(extern,static,typedef,const)
- c++ 尽量不要使用#define 而是用const、enum、inline替换。
- php面向对象全攻略 (十) final static const关键字的使用
- c#.net中const和readonly的区别
- C++中const的实现机制深入分析
- 解析C语言中如何正确使用const
- C/C++中static,const,inline三种关键字详细总结
- C++ 中const 类型限定符不兼容问题
- C++ const修饰变量和修饰函数介绍
- C++类中的static和const用法实例教程
- ASP.NET中readonly与const的区别详解
- 浅谈c#中const与readonly区别
- C#中const用法详解
- 深入探讨C#中的const、readonly关键字