C++中的const函数

在C++中,const 是一个非常重要的关键字,用来定义常量只读属性。它可以用在变量、函数参数、返回值、成员函数等多个地方,限制特定内容的修改权限,从而提高代码的安全性和可读性。以下是 const 的详细介绍:

1. const 修饰普通变量

  • 定义为 const 的变量在初始化后不能再被修改

  • 示例:

    const int a = 10; // a 是一个常量,值为 10
    a = 20;           // 错误,无法修改
    
  • 作用:

  • 防止意外修改。

  • 提高代码的稳定性。


2. const 修饰指针

在指针中,const 可以修饰指针本身或者指针所指向的数据,甚至两者同时修饰。

a) 指针指向的值是 const

const int *p;  // 指向常量的指针,不能通过 p 修改指向的值
int val = 10;
p = &val;      // 可以改变 p 的指向
*p = 20;       // 错误,无法通过 p 修改 val 的值

b) 指针本身是 const

int *const p = &val;  // 常量指针,p 不能指向其他地址
*p = 20;              // 可以修改指向的数据
p = &other_val;       // 错误,p 本身是 const

c) 两者都是 const

const int *const p = &val;  // p 的指向和指向的值都不能改变
*p = 20;                   // 错误
p = &other_val;            // 错误

3. const 修饰函数参数

const 可以用于函数参数,以限制参数在函数内被修改。常用于按引用或指针传递的参数。

a) 修饰指针参数:

void func(const int *p) {
    *p = 20;  // 错误,不能通过 p 修改指向的值
}

b) 修饰引用参数:

void func(const int &ref) {
    ref = 20; // 错误,不能修改引用的值
}

作用:

  • 提高代码的安全性,防止函数修改输入的原始数据。
  • 提高效率,避免按值传递带来的拷贝开销。

4. const 修饰函数返回值

  • const 可以修饰函数的返回值,以防止对返回值进行修改。

a) 修饰返回值:

const int getValue() {
    return 10;
}

getValue() = 20; // 错误,无法修改返回值

b) 修饰指针返回值:

const int* getPointer() {
    static int x = 10;
    return &x;
}

int *p = getPointer();  // 错误,不能通过 p 修改返回值

5. const 修饰类成员

a) 修饰类成员变量(常量成员):

  • 必须在初始化列表中初始化。
class MyClass {
    const int a;  // 常量成员
public:
    MyClass(int val) : a(val) {}
};

b) 修饰类成员函数(常量成员函数):

  • 表示函数不能修改对象的成员变量。
class MyClass {
    int data;
public:
    void display() const {
        // data = 10; // 错误,不能修改成员变量
    }
};
  • 常量对象只能调用常量成员函数
const MyClass obj;
obj.display(); // 可以调用

6. mutableconst 的结合

  • 如果一个类的成员变量被声明为 mutable,即使在 const 成员函数中也可以修改它。
class MyClass {
    mutable int counter;
public:
    void increment() const {
        counter++;
    }
};

7. const 与宏的对比

  • const 是类型安全的,适用于变量或对象;#define 创建的常量没有类型检查。
const int a = 10;   // 类型安全
#define A 10        // 没有类型

总结

const 在 C++ 中用于增强代码的安全性可读性,其应用场景广泛,包括:

  1. 修饰变量,表示常量。
  2. 修饰指针,控制指针或其指向数据的修改权限。
  3. 修饰函数参数,防止修改传入的数据。
  4. 修饰返回值,限制对返回值的修改。
  5. 修饰类成员,保证类的不可变性。

通过正确使用 const,可以有效避免意外修改数据,提高代码的稳定性和可靠性。