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

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

一 const 变量的初始化与存储

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

二 const 与指针

  • 指针常量:

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

  • 常量指针:

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

例子如下:

cpp 复制代码
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 修饰,就可以防止函数内意外修改该参数,起到保护作用
cpp 复制代码
void  func1(const int a, const int* b){
    a = 66; // 错误, 不可修改
    *b = 6; // 错误, 不可修改
    int aaa = 888;
    b = &aaa;
}
  • const 修饰函数返回参数

返回值为const值,或者const指针,const引用时该如何考虑呢?

  1. 返回值为const值传递

若是返回值是值传递,因为会进行拷贝,获取到的是副本,此时加 const 关键字没有什么用处

  1. 返回值为const 指针传递

若是返回值为指针,此时加 const 则意味着返回的指针锁指向的内容不可以被修改

  1. 返回值为const 引用传递

若是返回值为引用,此时加 const 则意味着返回的变量不可修改

  1. const 修饰的类成员函数

类成员函数加上 const 后,意味着该函数不可以修改类的成员变量,也不可以调用其他非 const 修饰的函数(因为无法预料非const 修饰的函数是否会修改类的成员变量)

cpp 复制代码
// 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;
}

输出:

相关推荐
Moonnnn.1 分钟前
【单片机期末】单片机系统设计
笔记·单片机·嵌入式硬件·学习
行云流水剑2 小时前
【学习记录】使用 Kali Linux 与 Hashcat 进行 WiFi 安全分析:合法的安全测试指南
linux·学习·安全
持久的棒棒君2 小时前
npm安装electron下载太慢,导致报错
前端·electron·npm
crary,记忆4 小时前
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
前端·webpack·angular·angular.js
门前云梦4 小时前
《C语言·源初法典》---C语言基础(上)
c语言·开发语言·学习
漂流瓶jz5 小时前
让数据"流动"起来!Node.js实现流式渲染/流式传输与背后的HTTP原理
前端·javascript·node.js
achene_ql5 小时前
select、poll、epoll 与 Reactor 模式
linux·服务器·网络·c++
SamHou05 小时前
手把手 CSS 盒子模型——从零开始的奶奶级 Web 开发教程2
前端·css·web
我不吃饼干5 小时前
从 Vue3 源码中了解你所不知道的 never
前端·typescript
开航母的李大5 小时前
【中间件】Web服务、消息队列、缓存与微服务治理:Nginx、Kafka、Redis、Nacos 详解
前端·redis·nginx·缓存·微服务·kafka