const和C++的类纠缠很深。C++语言是很严谨的语言,对各种情况考虑的很全面,而const限定符可以实现权限限定,这个和严谨的C++语言不谋而合。const在C++中用处很多,本篇章只讲解它和类的用法。
const修饰成员数据
const修饰的成员数据定义以后不能被修改,这样可以保护该数据。
代码:
#include <iostream>
using 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() {
}
结论:
1、const成员数据可以在类内中初始化,但是标准要是C++11。
2、const成员数据可以通过构造函数的初始化列表来初始化,初始化列表只有构造函数才有。
3、const成员数据定义以后不允许再修改,初始化只有通过类内初始化或者构造函数的初始化列表。
4、const静态成员数据只能类内初始化,并且以后不能再修改。
const修饰的成员函数
const修饰的成员函数主要是用来给const修饰的对象调用的。所以如果成员函数不修改成员数据,尽量定义成const成员函数。const函数不可以修改成员数据。
代码:
#include <iostream>
using 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;
}
总结:
1、const对象只能访问const修饰的成员函数
2、const成员函数不能修改成员数据
3、普通对象可以访问const修饰的成员函数
const在参数传递中的坑(C++语法严谨的体现)
普通对象:Man man1;
const修饰的对象:const Man man2;
普通引用对象:Man& man3;
const引用对象:const Man& man4;
普通引用对象,可以引用普通对象。
const引用对象,可以引用普通对象和const对象。
理解的知识点,永远比记忆来的长久。
如何去理解呢?
你可以给对象起别名,但是我这对象本身是不可修改的。你拿到以后你也是不可以修改。
我传给你这个对象本身可以修改,那么你引用拿到以后,修改和不修改都随你,因为该对象本身没有去限定权限。
代码:
#include <iostream>
using 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;
}