0
点赞
收藏
分享

微信扫一扫

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

黄昏孤酒 2023-09-01 阅读 63

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


输出:

举报

相关推荐

0 条评论