C++ 学习系列 -- const 关键字

C++ 中引入了 const 关键字,被 const 关键字修饰的变量其值不能修改,是只读的。

一   const 变量的初始化与存储

1. const 变量初始化时就需要赋初值,否则无法编译通过

二  const 与指针

  • 指针常量:

    指针所指向的值不可改变,但是指针本身是可以改变的

  • 常量指针:

    指针本身是不可以改变的,但是所指向的值是可以改变的

例子如下:

int main()
{
    char   p[] = "wo shi hao ren!";
    char*  p1 = "wo shi hao ren!";
    std::cout << "p: "<

三  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

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;
}


输出:

你可能感兴趣的:(c++,学习,前端)