在C++中,const关键字是一个非常重要的类型修饰符,它用于表示某个变量、对象或函数的返回值是常量,即其值在初始化后不能被修改。const的用法广泛,包括在变量声明、函数参数、函数返回值以及成员函数定义中。下面是一些const的基本用法:
修饰变量
当const用于修饰变量时,表示该变量的值在初始化后不能被修改。
//常量,二者等价
int const a = 1;
const int a = 1;
//数组,二者等价
int const arr [5] = {1,2,3,4,5};
const int arr [5] = {1,2,3,4,5};
修饰指针
- 既不是const指针,也不是const内容
int val = 10;
int* ptr = val;
- 修饰指针指向的内容:
int val = 10;
const int* ptr = &val; // ptr指向的内容不能通过ptr修改,但ptr可以指向其他地址
- 修饰指针本身(指针常量):
int val = 10;
int* const ptr = &val; // ptr不能指向其他地址,但ptr指向的内容可以通过ptr修改
- 同时修饰指针和指针指向的内容:
int val = 10;
const int* const ptr = &val; // ptr不能指向其他地址,ptr指向的内容也不能修改
1、如果const位于星号 * 的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
2、如果const位于星号 * 的右侧,const就是修饰指针本身,即指针本身是常量。
3、通俗理解:左定值,右定向,const修饰不变量
修饰函数参数
在函数定义中,const可以修饰参数,表示在函数体内不会修改该参数的值。这既可以增强代码的可读性,也可以让函数能够接收常量引用或指针,从而避免不必要的拷贝。
注意:如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。
void display(const int& num) { // 使用引用传递,且不会修改num的值
// ...
}
void process(const char* str) { // 不会修改str指向的字符串内容
// ...
}
修饰函数返回值
- 如果是值传递,没有必要将返回值用const修饰
//对于函数来说,它的返回值为一个int类型的值,是一个临时的值没有必要用const修饰。
const int func();
- 如果返回值为指针,加上const修饰后,同样的内容是不可以修改的。
这个时候接收的变量也必须是const修饰:
const char* func();
char* str = func();// 报错
const char* str = func(); //正确
修饰成员函数
class MyClass {
public:
void func(int x) const;
};
- const 修饰的成员函数为了保护成员变量,要求const 函数不能修改成员变量,否则编译会报错。
- 函数体内不能修改成员变量的值,增加程序的健壮性或鲁棒性。只有成员函数才可以在后面加const,普通函数后加const无意义。
class MyClass {
public:
int getValue() const { // 表明这个函数不会修改任何成员变量
return value;
}
private:
int value;
};
最后举例
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
// 获取实部和虚部的函数,后面加 const
double getReal() const {
return real;
}
double getImag() const {
return imag;
}
// 设置实部和虚部的函数,不加 const
void setReal(double r) {
real = r;
}
void setImag(double i) {
imag = i;
}
// 加法运算符重载函数,后面加 const
Complex operator+(const Complex& other) const {
return Complex(real + other.real, imag + other.imag);
}
};
int main() {
const Complex c1(1.0, 2.0);
const Complex c2(3.0, 4.0);
// 可以调用 const 成员函数
Complex c3 = c1 + c2;
std::cout << "c1 + c2 = (" << c3.getReal() << ", " << c3.getImag() << ")" << std::endl;
// 尝试调用非 const 成员函数会导致编译错误
// c1.setReal(5.0); // 编译错误
return 0;
}
在这个示例中,
getReal
、getImag
和operator+
都被声明为const
成员函数,因此它们可以在 const 对象上调用。- 而
setReal
和setImag
不是const
成员函数,因此不能在const
对象上调用。 - 所以
Complex c3 = c1 + c2;
不会报错,c1.setReal(5.0);
报错了。