在C++编程中,const关键字用于定义不可修改的常量,合理使用const可以让代码更清晰、更安全,避免意外的变量修改。下面我们来详细分析const常量的常见用法。

修饰普通变量
const修饰普通变量时,该变量的值在初始化后就不能再被修改,必须在定义时完成初始化。
#include <iostream>
using namespace std;
int main() {
// 定义const常量,必须初始化
const int MAX_SIZE = 100;
// 以下代码会编译报错,不能修改const变量的值
// MAX_SIZE = 200;
cout << "MAX_SIZE的值为:" << MAX_SIZE << endl;
return 0;
}
修饰指针
const修饰指针时有两种常见情况,分别是常量指针和指针常量,两者的区别需要重点区分。
常量指针
常量指针是指指针指向的内容是常量,不能通过指针修改指向的值,但指针本身可以指向其他地址。
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
// 常量指针,const在*左边
const int* p = &a;
// 以下代码编译报错,不能修改指针指向的内容
// *p = 15;
// 指针可以指向其他地址
p = &b;
cout << "p指向的值为:" << *p << endl;
return 0;
}
指针常量
指针常量是指指针本身是常量,指针的指向不能修改,但可以通过指针修改指向的内容(如果指向的内容不是const类型)。
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
// 指针常量,const在*右边
int* const p = &a;
// 可以修改指向的内容
*p = 15;
// 以下代码编译报错,不能修改指针的指向
// p = &b;
cout << "a的值为:" << a << endl;
return 0;
}
修饰函数参数
将函数参数用const修饰,可以避免函数内部意外修改参数的值,同时可以接收const类型的实参,提升函数的通用性。
#include <iostream>
#include <string>
using namespace std;
// 函数参数用const修饰,避免修改传入的字符串
void printName(const string& name) {
// 以下代码编译报错,不能修改const引用参数
// name = "test";
cout << "姓名:" << name << endl;
}
int main() {
string myName = "张三";
printName(myName);
// 也可以传入const字符串
const string constName = "李四";
printName(constName);
return 0;
}
修饰函数返回值
const修饰函数返回值时,根据返回值类型不同作用不同,常见的是修饰返回的指针或引用,避免返回值被修改。
#include <iostream>
using namespace std;
// 返回常量指针,避免外部修改返回的地址指向的内容
const int* getConstPtr() {
static int num = 50;
return #
}
int main() {
const int* p = getConstPtr();
// 以下代码编译报错,不能修改常量指针指向的内容
// *p = 60;
cout << "获取到的值为:" << *p << endl;
return 0;
}
修饰类成员
const可以修饰类的成员变量和成员函数,分别有对应的使用规则。
修饰成员变量
const成员变量必须在类的构造函数的初始化列表中完成初始化,不能在构造函数体内赋值。
#include <iostream>
using namespace std;
class Student {
private:
// const成员变量
const int id;
public:
// 必须在初始化列表中初始化const成员变量
Student(int studentId) : id(studentId) {}
void showId() {
cout << "学生ID:" << id << endl;
}
};
int main() {
Student stu(1001);
stu.showId();
return 0;
}
修饰成员函数
const修饰成员函数时,该函数不能修改类的任何非mutable成员变量,也不能调用非const成员函数。
#include <iostream>
#include <string>
using namespace std;
class Book {
private:
string title;
mutable int readCount; // mutable成员可以被const函数修改
public:
Book(string t) : title(t), readCount(0) {}
// const成员函数
string getTitle() const {
// 以下代码编译报错,不能修改非mutable成员变量
// title = "new title";
// 可以修改mutable成员
readCount++;
return title;
}
void showReadCount() const {
cout << "阅读次数:" << readCount << endl;
}
};
int main() {
const Book book("C++入门教程");
cout << "书名:" << book.getTitle() << endl;
book.showReadCount();
return 0;
}