C++之const使用

C++11小时前发布 admin 0

前言

记录一下C++const的使用,主要涉及const修饰指针、变量,函数、对象等情况下的使用,简单记录于此,方便自己查阅。

正文

在 C++ 中,const常量)关键字是构建安全、规范、高性能代码的基石。它不仅仅用来声明“不可修改的值”,更重要的是用于表达接口契约编译期约束,从而在编译阶段提前捕获错误。

修饰变量

const 修饰变量后,该变量在生存期内不可被修改,且定义时必须初始化。

  • 普通变量const int MAX_SIZE = 100;

  • 常数组const int arr[5] = {1, 2, 3, 4, 5};

  • 优势:相比于 C 语言的 #define 宏,const 具有类型检查,且可以节省不必要的内存分配(编译器通常不会为 const 变量分配内存,而是直接替换为字面量)。

修饰指针与引用

const 在指针和引用中用于限制修改权限,分为“底层 const”(修饰指向的内容)和“顶层 const”(修饰指针本身)。

  • 常量指针const int *p; (指向的内容不可变,指针可换指向)

  • 指针常量int * const p; (指针指向不可变,内容可改)

  • 常量引用const int &r = a; (不能通过引用 r 修改 a 的值)

安全准则:降低权限是安全的(例如将 int* 赋值给 const int*),但提升权限(将 const int* 赋给 int*)是危险的,编译器会报错。

修饰函数参数

在函数传参时,尤其是传递大对象(如 std::string, std::vector)时,强烈建议使用 const Type&(常量引用)。

  • 作用:告诉编译器该参数在函数体内是只读的,防止函数内部意外修改传入的数据,同时避免了对象的拷贝开销。

  • 示例void print(const std::string &str);

修饰成员函数与对象

这是面向对象编程中 const 最核心、也最容易被忽视的用法。

  • const 成员函数const 放在成员函数参数列表的右侧(如 int getValue() const;),表示这是一个“只读”函数。该函数承诺不会修改类的任何非静态数据成员,也不能调用其他非 const 的成员函数。

  • const 对象一旦将对象定义为 const(如 const MyClass obj;),它就只能调用 const 成员函数

  • const 函数重载C++ 允许仅凭 const 来重载成员函数。非 const 对象优先调用非 const 版本,const 对象只能调用 const 版本。

class MyClass {
public:
    // 非 const 版本:允许修改内部状态
    std::string& getData() { 
        return data; 
    }
    // const 版本:只读访问
    const std::string& getData() const { 
        return data; 
    }
private:
    std::string data;
};

mutable 关键字

如果一个类的成员函数被声明为 const,但确实需要在其中修改某个不影响对象核心逻辑状态的变量(例如:缓存数据、访问次数统计、日志标记),可以使用 mutable 关键字修饰该成员变量。

class Message {
private:
    std::string text;
    mutable int accessCount = 0; // 允许在 const 函数中修改
public:
    void print() const {
        accessCount++; // 合法操作
        std::cout << text << std::endl;
    }
};

总结来说,在 C++ 中养成“默认使用 const”的习惯(如默认使用 const & 传参、默认将不修改状态的成员函数标记为 const),能极大地提升代码的健壮性和可维护性。

参考文章

  1. AI

  2. C++图书

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...