C++ const使用

const表示可读,但不能修改

修饰的内容不同,自然有不同的作用

1.const 修饰变量

a. const 修饰局部变量
cpp 复制代码
	const int a;	// 编译错误,未初始化
	const int a = 1;

	int& a = 10;	// 编译错误,非常量引用的初始值必须为左值
	const int& a = 10;
b. const 修饰指针变量(顶层const)

指针的指向不可变,指针指向的值可变

cpp 复制代码
	int* const a;	// 编译错误,未初始化
	int b = 3;
    int* const a = &b;
    int c = 4;
    a = &c;			// 编译错误,表达式必须是可修改的左值
c. const 修饰指向指针的变量(底层const)

指针指向的值 不可变,指针的指向可变

// todo

// 引用

const指针和指向const变量的指针,在写法上容易使人混淆。给大家介绍一种我自己用着比较顺手的区分方法:从右向左,依次结合,const就近结合。

比如,int * const p 可以这样进行解读:

1、int * ( const p ):变量p 经过 const 修饰,为只读变量。

2、int (* (const p)):(const p 现在作为一个整体) 只读变量p是一个指针。

3、(int (* (const p))):(同样的 * const p 作为一个整体) 这个只读的指针p,指向一个int型变量。

2. const 修饰函数

a. const 修饰函数参数

函数内部不能修改值

修饰形参指针也同上

cpp 复制代码
	void foo(const int val);	// foo中不可修改val
b. const 修饰函数返回值

函数返回const返回值,主要用于函数返回const引用。

cpp 复制代码
const int foo()
{
	int a = 1;
	return a;
}

3. const 修饰类

a. const 修饰类成员

同修饰变量

cpp 复制代码
class A
{
	const int a = 0;
};
b. const 修饰成员函数

const成员函数指的是,此函数不应该修改任何成员变量;但是mutable 修饰的变量可以被修改

传给const成员函数的this指针,是指向 const 对象 的 const 指针。

cpp 复制代码
class A
{
	int a;

	int getA const()
	{
		return a;
	}
};

PS: 静态成员变量并不属于某个类对象,而是整个类共有的。静态成员变量可以不依附于某个实例化后的类对象进行访问。那么,静态成员变量的值,应该在任何实例化操作之前,就能够进行改变(否则,只有实例化至少一个对象,才能访问静态成员)。所以,静态成员变量不能够由构造函数进行内存分配,而应该在类外部单独定义,在实例化任何对象之前,就开辟好空间。又由于 const 成员变量 必须初始化,所以静态成员变量必须在定义的时候就初始化。

c. const 修饰类实例

const类对象指的是,此类对象不应该被改变。

类对象的 "改变" 定义:改变任何成员变量的值,调用任何非const成员函数

相关推荐
枯萎穿心攻击23 分钟前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
Jerry Lau30 分钟前
go go go 出发咯 - go web开发入门系列(一) helloworld
开发语言·前端·golang
nananaij33 分钟前
【Python基础入门 re模块实现正则表达式操作】
开发语言·python·正则表达式
Micro麦可乐39 分钟前
Java常用加密算法详解与实战代码 - 附可直接运行的测试示例
java·开发语言·加密算法·aes加解密·rsa加解密·hash算法
天下一般44 分钟前
go入门 - day1 - 环境搭建
开发语言·后端·golang
雷羿 LexChien1 小时前
C++内存泄漏排查
开发语言·c++
水果里面有苹果1 小时前
17-C#的socket通信TCP-1
开发语言·tcp/ip·c#
手握风云-1 小时前
JavaEE初阶第七期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(五)
java·开发语言
nightunderblackcat1 小时前
进阶向:Python音频录制与分析系统详解,从原理到实践
开发语言·python·音视频
嘉小华1 小时前
CMake 完全指南:第一章 - 构建的烦恼 - 为什么需要CMake?
c++