780 字
4 分钟
const的用法
2025-03-12

const是C++中的一个关键字,用于声明变量、函数参数、返回值或成员函数为常量,即它们的值在初始化后不能被修改。const的用法非常灵活,可以用于多种场景,以下是一些主要的用法:

常量变量#

const int MAX_SIZE = 100;

这里,MAX_SIZE被声明为一个常量,其值在初始化后不能改变。

指向常量的指针#

const int *ptr = &MAX_SIZE;

ptr是一个指向常量的指针,不能通过ptr来修改MAX_SIZE的值。

常量指针#

int value = 10;
int *const ptr = &value;

ptr是一个常量指针,它始终指向value,但不能指向其他变量。

指向常量的常量指针#

const int value = 10;
const int *const ptr = &value;

ptr既不能改变指向的值,也不能改变指向的地址。

常量引用#

const int &ref = value;

refvalue的常量引用,不能通过ref来修改value

常量成员函数#

在类中,可以声明成员函数为const,表示这个函数不会修改类的成员变量。

class MyClass {
public:
    int getValue() const {
        return value;
    }
private:
    int value;
};

常量表达式#

C++11引入了constexpr,用于声明常量表达式,这些表达式在编译时就能计算出来。

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : n * factorial(n - 1);
}
constexpr int result = factorial(5); // 在编译时计算

对象常量#

可以声明对象为常量,这样对象的成员就不能被修改。

const MyClass obj;

常量与多态#

const成员函数可以用于多态,因为它们可以被子类覆盖,并且保持const属性。

class Base {
public:
    virtual void display() const {
        // ...
    }
};
class Derived : public Base {
public:
    void display() const override {
        // ...
    }
};

常量与模板#

const可以与模板一起使用,以创建通用的常量类型。

template<typename T>
void print(const T& value) {
    // ...
}

保护参数#

函数的参数可以加上const修饰,以避免无意识的修改const变量。

通过指针可以绕过const修饰,但这种方法不推荐,因为它破坏了const的语义,可能导致未定义行为。

示例:

void modifyValue(const int* value) {
    int* nonConstPtr = const_cast<int*>(value); // 强制转换去除const
    *nonConstPtr = 10; // 修改值
}

int main() {
    int a = 5;
    modifyValue(&a);
    std::cout << a << std::endl; // 输出10
    return 0;
}

注意: 使用const_cast时要非常小心,因为它破坏了常量性,可能导致未定义行为,特别是如果原始数据确实不应该被修改时。

注意事项:#

  • const变量必须在声明时初始化,除非它是静态存储期变量。
  • const对象只能调用const成员函数。
  • const指针和const引用可以指向非const对象,但通过它们不能修改对象的值。
  • const在函数参数中用于表示参数不会被修改,这有助于提高代码的可读性和安全性。 const的这些用法有助于编写更安全、更可维护的代码,通过限制变量的可变性,可以避免一些常见的编程错误。
const的用法
http://zaoweiceng.github.io/posts/cpp/const的用法/
作者
静惜
发布于
2025-03-12
许可协议
CC BY-NC-SA 4.0