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值传递
2. 返回值为const 指针传递
3. 返回值为const 引用传递
4. 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;
}
输出: