const和C++的类纠缠很深。C++语言是很严谨的语言,对各种情况考虑的很全面,而const限定符可以实现权限限定,这个和严谨的C++语言不谋而合。const在C++中用处很多,本篇章只讲解它和类的用法。
const修饰成员数据const修饰的成员数据定义以后不能被修改,这样可以保护该数据。
代码:
#includeusing namespace std; class Man { public: // 使用初始化列表来初始化a的值,初始化列表只能出现在构造函数中 Man(int c):a(c) { } // 1、错误的const数据成员定义以后不可以再修改 // Man(){ // a = 12; // } private: const int a; // C++11才支持类内初始化 static const int d = 11; // const修饰的静态数据成员只能在这里初始化,并且以后不能再修改 }; int main() { }
结论:
const修饰的成员函数1、const成员数据可以在类内中初始化,但是标准要是C++11。
2、const成员数据可以通过构造函数的初始化列表来初始化,初始化列表只有构造函数才有。
3、const成员数据定义以后不允许再修改,初始化只有通过类内初始化或者构造函数的初始化列表。
4、const静态成员数据只能类内初始化,并且以后不能再修改。
const修饰的成员函数主要是用来给const修饰的对象调用的。所以如果成员函数不修改成员数据,尽量定义成const成员函数。const函数不可以修改成员数据。
代码:
#includeusing namespace std; class Man { public: Man() { } ~Man() { } void test1() { } void test2 () const { // a = 10; const成员函数不允许修改数据成员 } private: int a; }; int main() { // 普通成员对象也可以访问到被const修饰的成员函数 Man man1; man1.test2(); // const对象只能访问到被const修饰的成员函数 const Man man2; man2.test2(); return 0; }
总结:
const在参数传递中的坑(C++语法严谨的体现)1、const对象只能访问const修饰的成员函数
2、const成员函数不能修改成员数据
3、普通对象可以访问const修饰的成员函数
普通对象:Man man1;
const修饰的对象:const Man man2;
普通引用对象:Man& man3;
const引用对象:const Man& man4;
普通引用对象,可以引用普通对象。
const引用对象,可以引用普通对象和const对象。
理解的知识点,永远比记忆来的长久。
如何去理解呢?
你可以给对象起别名,但是我这对象本身是不可修改的。你拿到以后你也是不可以修改。
我传给你这个对象本身可以修改,那么你引用拿到以后,修改和不修改都随你,因为该对象本身没有去限定权限。
代码:
#includeusing namespace std; class Man { public: int getNum() const { return num; }; private: int num = 11; }; // const Man & man可以引用man或者 const Man man void test1(const Man & man) { } // Man & man 不能引用 const Man man void test2( Man& man) { } int main() { Man man1; const Man man2; test1(man1); test1(man2); test2(man1); test2(man2); // 这是不允许的会报错 return 0; }



