C++的关键字const

const的用法

常量声明

const用于声明时必须进行初始化,大致格式为:<数据类型> const <常量名> = <值>

或 const <数据类型><常量名> = <值>。此时const的位置不影响语义

声明一个常量:

const 可以用于声明一个变量为常量。常量的值在声明后不能被修改

cpp 复制代码
int const a = 10;  // read-only variable  
int const  b;       // 错误!!!必须进行初始化
a++;               // 错误!!!不能对值进行更改
const int c = 10;  // read-only variable  

声明类的成员变量为常量

在类的声明中,可以使用 const 来声明成员变量为常量。这意味着不能修改这些成员的值

cpp 复制代码
class MyClass {
public:
	int const a = 1;  // read-only variable  
	int const b;      // 错误!!!必须进行初始化 
	const int c = 1;  // read-only variable  
	void func();
	void print_a();   
};
void MyClass::func() {
	this->a++;            // 错误!!!不能对值进行更改
}
void MyClass::print_a() {
	cout<<"a = "<<a<<endl; 
}
int main() {
	MyClass c;
	return 0;
}

声明常量数组:

const修饰数组。那么数组中的所有元素都被视为常量,不能被修改

cpp 复制代码
int const arrayA[5] = {1, 2, 3, 4, 5};
int const arrayB[5];                   // 错误!!!必须进行初始化
A[0] = 5;                              // 错误!!!数组中所有值能进行更改
const int arrayC[4]={1,2,3};

const和指针搭配

此时const的位置不同将会导致语义不同

声明常量指针

const 可以用于指针的声明。表明指针的值不可更改,即指向不可更改

  • 指针是一种特殊的数据类型,指针的值是某个数据的内存地址,即指针指向该数据
cpp 复制代码
int a = 10;
int b = 20;
int* const ptr = &a;
int* const p;   // 错误!!!常量指针声明时必须初始化
ptr = &b;        // 错误!!!常量的值初始化后不可改变,即常量指针的指向不可更改

声明指针常量

此时指针的值可以改变,即指针指向可以更改,但是指向的内存地址保存的内容不可更改

可以这么理解,由于 const int 和 int cosnt语义相同,

那么int const* ptr = &a; 和 const int* ptr = &a;语义相同。const修饰的是* ptr

cpp 复制代码
int a = 10;
int b = 20;
int const* ptr = &a; // 等价于 const int* ptr = &a;
  

函数中,声明参数变量为常量

const 可以用于函数参数的声明,该参数不能被修改,可以防止意外修改传入的参数值

cpp 复制代码
 void print(const int& num) { //调用函数时已经对参数进行初始化了
 	num++;                    // 错误!!!不能对值进行更改
    cout << num << endl;
}
// 也可以这样
void print(int const& num) { //调用函数时已经对参数进行初始化了
 	num++;                    // 错误!!!不能对值进行更改
    cout << num << endl;
}

声明常量类成员函数

常量类成员函数不可以修改所有的成员变量

c 复制代码
class myClass {
public:
//	const int a = 1;
	int age;
	
	void setAge() const; 
	void changeAge();
};
void myClass::setAge() const{
	age = 10;     // 错误!!!常量类成员函数不可以修改所有的成员变量
}

void myClass::changeAge() {
	age = 10;
}
相关推荐
努力实干2 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
syagain_zsx4 小时前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
布莱克6055 小时前
理解 = delete 与 = default:两种赋值语义的差异
c++
小小、码农6 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++
库玛西7 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
General_G9 小时前
创建型模式—原型(Prototype)模式
c++·设计模式·原型模式
syagain_zsx9 小时前
protobuf 实战:从 .proto 到 C++ 序列化的完整链路
c++·学习·程序人生·谷歌·protobuf
welfare9629 小时前
新号别搞:C++_list
开发语言·c++
xiaoye-duck9 小时前
《C++ 项目:手写大模型接入 SDK》云端 API 调用基础与 Apifox 调试实战
网络·c++·语言模型
坤坤子吖9 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习