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.cpp
int 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;
}
输出: