定义const变量
通常使用const来定义常量,在变量的前面加上const关键字即可如下:
const int a; int const a; //表示a的值是一个常量,不可以通过赋值的方式来修改
在C++中const被当成编译期的常量来处理,也就是说,编译器不为const常量分配空间,只在编译时将它的值保存在名字列表中,当我们通过内存地址间接修改常量的值时,其结果保持不变。代码如下:
#include<stdio.h> int main() { const int a=1; int *p=(int*)&a; *p=100; printf("a=%d\n",a); return 0; }
其运行结果如下:a=1;
在类与对象中的应用:
在C++中const在类与对象中的应用主要有以下几个场合:
(1):常量数据成员的应用
(2):函数的参数为常量的应用
(3):常量函数的应用
(4):常量对象的应用
常量数据成员的应用
若类中的某个数据成员是常量,表示这个数据成员不能直接被修改,故const数据成员要求初始化,在类中数据成员是不允许在定义时初始化的,类仅仅是一种数据类型,类中的数据成员和成员函数的使用都是通过实例的对象调用,也就是说,有了对象类中的数据成员和函数成员才有了生命,因此const数据成员的初始化应该在对象产生的时刻,即应该在构造函数中初始化,并且const数据成员是在构造函数的初始化表中进行的。程序如下:
class A { private: int a; const int b; //const常量 public: A(int a, int b):a(a),b(b){} //const数据成员初始化 void show() { cout<<a<<","<<b<<endl; } };
注:const数据成员是必须在构造函数的初始化表中进行!!!!
函数参数为常量的应用方法
类中的函数成员的参数通常使用引用,表示用源头的数据,不会再自己复制一份。当希望传递给函数成员的数据不被破坏,就需要定义成const变量
#include<iostream> using namespace std; class A { private: int a; const int b; public: A(int a, int b):a(a),b(b){} void show() { cout<<"a="<<a<<","<<"b="<<b<<endl; } void set(const int &x) //通过引用直接访问x,并且保证x的值不会被篡改 { a=x; } }; int main() { int x=99; A a(1,2); a.show(); a.set(x); a.show(); return 0; }
运行结果:
a=1,b=2 a=99,b=2
常量成员函数与常量对象的使用方法
在C++中,常量函数必须定义在类中,以成员函数的形式出现,常量成员函数的好处就是保证类的封装性,能够有效的防止类的数据成员被非法访问。
常量函数的定义:
int fun(void) const;
注意:const int fun(void);表示的是该函数的返回值为常量,不可与常量函数混淆!!
上面的常量函数 int fun(void) const 实际上与int fun(void)构成重载关系,重载函数是通过函数的参数或个数不同来构成重载的,int fun(void) const 与int fun(void)构成重载关系是因为this指针,普通函数的this指针是普通指针,而const成员函数是常量指针。
对象调用常量函数规则有以下几个(归根到底就是this指针是常量指针):
1、非常量对象可以调用常量函数
2、非常量对象可以调用非常量函数
3、常量对象可以调用常量函数
4、常量对象不可以调用非常量函数
5、常量函数和非常量函数重载时,非常量对象调用非常量函数
6、常量函数和非常量函数重载时,常量对象调用常量函数
总结:归根到底常量函数还是属于对象的(和static要区分开),故可以被任何对象调用;
常量对象由于this指针是常量指针,故不可以调用非常量函数(常量函数可以接受非常量,但不可以把常量赋给非常量);
突破常量成员函数修改数据成员的限制
将this常量指针转换为非常量指针
将this常量指针的const属性去掉,可以使用const_cast(去const)运算符完成
将数据成员定义为mutable属性
将数据成员定义为:mutable int a;就可以间接实现常量函数修改成员数据。