C++ 中引入了 const 关键字,被 const 关键字修饰的变量其值不能修改,是只读的。
一 const 变量的初始化与存储
1. const 变量初始化时就需要赋初值,否则无法编译通过
二 const 与指针
- 指针常量:
指针所指向的值不可改变,但是指针本身是可以改变的
- 常量指针:
指针本身是不可以改变的,但是所指向的值是可以改变的
例子如下:
int main()
{char p[] = "wo shi hao ren!";char* p1 = "wo shi hao ren!";std::cout << "p: "<<p << std::endl;std::cout << "p1: "<<p1 << std::endl;const int a = 66;// const int b; // 编译不过,需要赋初值// 常量指针const char* p2;// 编译通过,值为空,但是值不可以变化p2 = p1; // 编译通过// *p1 = "666"; // 编译不过, 因为值不可以变化// 指针常量char* const p3 = p1; // 指针不可以变,其指向的值可变// p3 = p2; // 编译不过,因为指针不可以变*p3 = 'b'; // 修改 p3 所指向的字符,因为指针常量指向的值是可变return 0;
}
三 const 与函数
- const 修饰函数参数
- 对于函数的入参,不管是什么数据类型,也不管是 指针传递,还是 引用传递,只要加了 const 修饰,就可以防止函数内意外修改该参数,起到保护作用
void func1(const int a, const int* b){a = 66; // 错误, 不可修改*b = 6; // 错误, 不可修改int aaa = 888;b = &aaa;
}
- const 修饰函数返回参数
返回值为const值,或者const指针,const引用时该如何考虑呢?
1. 返回值为const值传递
若是返回值是值传递,因为会进行拷贝,获取到的是副本,此时加 const 关键字没有什么用处
2. 返回值为const 指针传递
若是返回值为指针,此时加 const 则意味着返回的指针锁指向的内容不可以被修改
3. 返回值为const 引用传递
若是返回值为引用,此时加 const 则意味着返回的变量不可修改
4. const 修饰的类成员函数
类成员函数加上 const 后,意味着该函数不可以修改类的成员变量,也不可以调用其他非 const 修饰的函数(因为无法预料非const 修饰的函数是否会修改类的成员变量)
// aaa.h
#include<string>class BBB
{
public:BBB(std::string name):m_name(name){}~BBB(){}public:std::string m_name;
};class AAA
{
public:AAA(BBB* ptr):m_ptr(ptr){}~AAA(){if(m_ptr)delete m_ptr;}const BBB getValue1(){return *this->m_ptr;}const BBB* getValue2(){return this->m_ptr;}const BBB& getValue3(){return *this->m_ptr;}BBB& getValue4() const{// getValue1(); // 编译不通过return *this->m_ptr;}private:BBB* m_ptr;
};// main.cppint main()
{BBB* bbb = new BBB("bbb666");cout << bbb->m_name << endl;AAA aaa(bbb);BBB b1 = aaa.getValue1();const BBB* b2 = aaa.getValue2();const BBB& b3 = aaa.getValue3();BBB& b4 = aaa.getValue4();b4.m_name = "888888"; // 可以改变 bbb 对象的成员变量值cout << bbb->m_name << endl;return 0;
}
输出: