C++中 const 限定符

1. 基本概念

在C++中,const是一个类型限定符,用于指定一个变量是常量,即其值在初始化后不能被修改。这有助于提高程序的可读性、可维护性和安全性,同时也允许编译器进行更多的优化。例如:

const int num = 10;
// num = 20; // 这是错误的,因为num是常量,不能被重新赋值

2. 常量的初始化

在定义时初始化:常量必须在定义的时候进行初始化。可以使用常量表达式或者其他已经初始化的变量来初始化常量。例如:

const int num1 = 5;
const int num2 = num1 * 2;

对于类的常量成员:如果是类的成员变量为const类型,需要通过初始化列表进行初始化(在构造函数中)。例如:

class MyClass {
    public:
        const int myConst;
        MyClass(int value) : myConst(value) {}
};

3. const与指针

指向常量的指针(const修饰所指对象):这种指针指向的对象是常量,不能通过该指针修改所指向的对象的值,但指针本身可以改变指向。例如:

const int num = 10;
const int* ptr = #
// *ptr = 20; // 错误,不能通过ptr修改num的值
int otherNum = 30;
ptr = &otherNum; // 可以改变指针的指向

常量指针(const修饰指针本身):指针本身是常量,不能改变指针的指向,但可以通过指针修改所指向对象的值(前提是所指向的对象不是常量)。例如:

int num = 10;
int* const ptr = #
*ptr = 20; // 可以修改num的值
// ptr = &otherNum; // 错误,不能改变指针的指向

指向常量的常量指针(const既修饰指针又修饰所指对象):指针本身不能改变指向,并且不能通过该指针修改所指向对象的值。例如:

const int num = 10;
const int* const ptr = #
// *ptr = 20; // 错误,不能修改num的值
// ptr = &otherNum; // 错误,不能改变指针的指向

4. const与函数

const修饰函数参数:如果函数的某个参数在函数体内不应该被修改,可以将该参数声明为const。这有助于提高程序的可读性,同时也防止函数内部意外修改参数的值。例如:

void printValue(const int num) {
    // num = 20; // 错误,不能在函数内部修改num的值
    std::cout << num << std::endl;
}

const修饰函数返回值:当函数返回一个常量时,返回值不能被用作左值(即不能被修改)。例如:

const int getValue() {
    static int num = 10;
    return num;
}
int main() {
    // getValue() = 20; // 错误,不能对常量返回值进行赋值操作
    std::cout << getValue() << std::endl;
    return 0;
}

const成员函数:在类中,成员函数可以被声明为const。const成员函数承诺不会修改类的成员变量(除了mutable成员变量)。例如:

class MyClass {
    public:
        int value;
        MyClass(int num) : value(num) {}
        int getValue() const {
            // value = 20; // 错误,在const成员函数中不能修改非mutable成员变量
            return value;
        }
};

5. const与类型别名

可以使用typedef或者using来创建const类型的别名。例如:

typedef const int ConstInt;
using AnotherConstInt = const int;

这样在定义变量时就可以使用这些别名来表示const类型。例如:

ConstInt num = 10;
AnotherConstInt otherNum = 20;

6. const表达式

C++11引入了constexpr关键字,用于表示常量表达式。constexpr函数或者变量的值在编译时就可以确定。const变量不一定是constexpr变量,但constexpr变量一定是const变量。例如:

constexpr int num = 5 + 3; // 这是一个constexpr变量,其值在编译时确定
const int otherNum = getValue(); // 这是一个const变量,但不是constexpr变量,因为getValue()是运行时确定的值


C++编程语言基础