作用
const修饰符用来定义常量,具有不可变性。
- 修饰变量,说明该变量不可以被改变;
- 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);
- 修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;
- 修饰成员函数,说明该成员函数内不能修改成员变量。
指针常量和常量指针?
指针常量指的是该指针本身是一个常量,不能被修改,但是指针指向的对象可以被修改。
int a = 10;
int b = 20;
int* const ptr = &a; // 指针常量
*ptr = 15; // 可以修改 a 的值
ptr = &b; // 错误:ptr 是指针常量,不能改变指
常量指针指的是这个指针指向的对象是一个常量,不能被修改,但是指针本身可以被修改。
int a = 10;
int b = 20;
const int* ptr = &a; // ptr 指向 a
*ptr = 15; // 错误:不能修改所指向的值
ptr = &b; // 可以改变 ptr 的指向
类型 | 指针是否可变 | 指向的值是否可变 | 定义方式 |
---|---|---|---|
指针常量 | 否 | 是 | int* const ptr = &a; |
常量指针 | 是 | 否 | const int* ptr = &a; |
const修饰的函数能否重载?
onst修饰的函数可以重载。
const
修饰的成员函数与非 const
修饰的成员函数被视为不同的函数签名。编译器会根据调用时对象的 const
性来决定调用哪个版本的函数。
- 非
const
对象:无论是否是const成员函数都能调用,但是如果有重载的非const函数,非const对象会优先调用重载后的非const函数。 const
对象:只能调用const
修饰的成员函数,也无法调用非const的成员函数;
示例代码
#include <iostream>
using namespace std;
class MyClass {
public:
void display() {
cout << "Non-const display()" << endl;
}
void display() const {
cout << "Const display()" << endl;
}
};
int main() {
MyClass obj; // 非 const 对象
const MyClass constObj; // const 对象
obj.display(); // 调用非 const 版本
constObj.display(); // 调用 const 版本
return 0;
}
输出:
Non-const display()
Const display()
宏定义 #define 和 const 常量 区别
宏定义 #define | const 常量 |
---|---|
宏定义,相当于字符替换 | 常量声明 |
预处理器处理 | 编译器处理 |
无类型安全检查 | 有类型安全检查 |
不分配内存 | 要分配内存 |
存储在代码段 | 存储在数据段 |
可通过 #undef 取消 | 不可取消 |