前言
const直译“常量”。在软件的开发中,我们会经常需要定义一些不能修改的变量。但在cpp中,由于变量的结构比较复杂,对不能修改这个概念,在不同的变量类型中,const的实际意义是不同的。
因此,本文意在列举const的细节和使用场景,作为备忘。
细节
const的值无法修改
const [type] a = ...;
这样定义后,a的值就不能再修改。
const的作用域
下面论述一下const对象和普通对象的区别。
(转载于http://blog.csdn.net/yipiantiandi/article/details/5822564)
(const对象默认作用域为:文件作用域)
(普通变量默认作用域:整个程序)
对于一般的对象 如 int a=9;;我们知道它的作用域是整个程序的,在1.cpp和2.cpp中包含同一个定义了int a=9;的头文件,因为int a=9;作用域是整个程序,所以会产生错误。
那为什么const int a=9;不会产生错误呢。原因就是const int a=9;的默认作用范围是文件作用域的。即,尽管在1.cpp和2.cpp中包含同一个定义了const int a=9;的头文件,但由于const int a=9;是文件作用域的,包含了头文件的1.cpp和2.cpp尽管都包含了const int a=9;但他们是各自文件内的const对象,两者互不相干,就像不同函数中定义了相同的变量名一样。
所以,通过在头文件中定义const对象,可以实现多个文件使用相同的常量值,这在实际的程序中很常见。
那么如何使用其他文件中的const
说到这里,有一点疑问需要解决:如果想在别的文件中访问本文件中的const对象该怎么办,如果都是单是在别的文件中使用extern const int a = 9;的话,不会起任何作用,因为已经提示const int a = 9;是文件作用域的。
所以应该在需要被其他文件使用的const对象定义成这样:extern const int a = 9;而在别的需要使用这个const对象的地方声明:extern const int a;前者是定义,后者是声明。这样就可以使用了。
取引用
int a = 42;
const int &b = a;
a = 41; //可以
b = 40; //报错
const int r1=42;
int &r2 = r1; //报错
此示例中,const int &b = a; 表示,b = a的引用,无法进行修改。但b引用的值,即a的值还是可以修改的。
指针
C++常量折叠
int main()
{
int i0 = 11;
const int i=0; //定义常量i
int *j = (int *) &i; //看到这里能对i进行取值,判断i必然后自己的内存空间
//请注意,int *j = &i;是不对的哦,我们在第4节讲过~
*j=1; //对j指向的内存进行修改
printf("%d\n%d\n%d\n%d\n",&i,j,i,*j); //观看实验效果
const int ck = 9; //这个对照实验是为了观察,对常量ck的引用时,会产生的效果
int ik = ck;
int i1 = 5; //这个对照实验是为了区别,对常量和变量的引用有什么区别
int i2 = i1;
return 0;
}
// output: 0012ff7c 0012ff7c 0 1
- i和j地址相同,指向同一块空间,i虽然是可折叠常量,但是,i确实有自己的空间。
- i和j指向同一块内存,但是
*j = 1
对内存进行修改后,按道理来说,*j==1
,i也应该等于1,而实验结果确实i实实在在的等于0,这是为什么呢,就是本文所说的内容,i是可折叠常量,在编译阶段对i的引用已经别替换为i的值了。
函数
int getAge() const;
int temp::getAge() const
{
age+=10; // #Error...error C2166: l-value specifies const object #
return age;
}
//返回值是指针类型,防止指针意外变化,所以用const修饰
const char* ret_p(){
return p;
}
//char* y=a.ret_p(); 这样编译会出错,需要const 修饰的
const char* y=a.ret_p();
- 加在后面的const表示,这个成员函数,无法修改成员变量
- 加在前面的const表示返回值为const。只有返回指针时才有意义
成员变量
class A
{ public:
A(int size) : SIZE(size) {}; private: const int SIZE;
};
int main()
{
A a(100);
}
成员变量加const无法修改,也无法进行初始化。初始化工作必须在构造函数中完成。
以上就是const在c++中常见的一些使用场景。c++语法繁杂,只有多学多练,在此共勉。
如有问题,欢迎指正。