一直以来都没有总结const修饰符的用法,总是感觉const的用法太多,要记住的情况太多,不能够掌握所有的情况,所以总是不了了之。但是如果没有彻底掌握const用法的话,心里总是感觉知识还欠缺很多,还要很多知识点没有掌握。如果自己真正的总结完之后,其实也只有这么多用法。
const修饰数据成员,成员函数,类对象。
- const修饰数据成员
修饰数据变量,保证数据变量只能在定义的时候进行初始化,并且在程序的执行过程中不能被再次赋值。
1、修饰类中的数据成员变量,可以直接在声明的时候进行初始化(const int num = 100;),不过最好还是在构造函数的初始化列表中进行初始化(必须用初始化列表进行初始化)。
class A { public: A(int val):num(val){ } private: const int num;//const成员变量 };
2、也可以在程序中定义const变量。const int num = 100;//比如在定义全局const变量num=100;
3、const int num = 100;等价于int const num = 100;
也就是说const int 和int const意思相同。
- const修饰成员函数
1、const修饰成员函数的返回类型
class A { public: A(int val):num(val){ } const void fun(int val){ cout << "num = " << num << endl; age = val; } private: const int num;//const成员变量 int age; };
此时const的位置有下面两种等价的情况:
const void
fun
();
void const
fun
();
2、const修饰成员函数的形参变量
此时const的位置有下面两种等价的情况:
void fun(const int val);
void fun(int const val);
3、const直接修饰成员函数
const放在函数声明之后,函数实现之前。void fun(int val)const;
const此时保证不会修改该对象的数据成员。
下面的例子是错误的,因为fun是const成员函数,它不能修改对象的成员变量age;
void fun(int val)const{ cout << "num = " << num << endl; age = val;//此时是错误的。 }
(1):const成员函数此时能访问const和非const数据成员。但不能修改非const数据成员。
(2):const成员函数中只能调用其它const的成员函数。
(3):void fun(int val)const;和void fun(int val);两个函数构成重载函数。
const对象只能调用const成员函数。
非const对象会优先调用非const成员函数,但是如果fun函数只有const函数,那么非const对象也会调用const成员函数。(但是该非const成员函数中不能修改对象成员变量)
- const修饰类对象
定义一个const对象a:const A a(100);
const修饰函数,是从函数的层面,不修改数据。
const修饰类对象,是从对象的层面,不修改数据,只能调用const成员函数。
const对象只能调用const成员函数。
非const对象会优先调用非const成员函数,但是如果fun函数只有const函数,那么非const对象也会调用const成员函数。(但是该非const成员函数中不能修改对象成员变量)