C++ const

本文详细解析C++中const关键字的应用,涵盖常量变量、指针、引用、类成员及返回值,讲解了const_cast和mutable的区别,以及Effective C++第三条款。重点讲解如何避免滥用和提升代码安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

回顾C++所学,做总结,希望能对大家有所帮助

目录

const修饰普通变量

const与#define区别

const修饰指针

const修饰引用

const修饰类成员变量

const修饰类成员函数

const修饰返回值

const_cast类型转换消除const

mutable突破const限制

Effective C++ 条款3


const修饰普通变量

const修饰普通变量后,该变量不可变

const int var = 10;
const char* = "Hello world";

const修饰的全局变量链接性为内部,就像全局变量添加了static一样,因此可以把常量写在头文件中,每个包含该头文件的文件都会有各自的常量

应在声明const常量时就对其进行初始化,常量只能被初始化,不能被赋值

尽量用const替换#define (Effective C++条款2)

定义c风格的字符串常量时应用const char* const,指针和内容都应该为常量


const与#define区别

1)处理阶段不同:

  #define是在预编译阶段,#define常量从未被编译器看见,因为在预处理截断就已经替换了;

  const常量在编译阶段使用。

2)类型和安全检查不同

  #define没有类型,不做任何检查,仅仅是字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误

  const常量有明确的类型,在编译阶段会进行类型检查;

3)存储方式不同

  #define是字符替换,不涉及内存

  编译器通常不会为const常量分配空间,只是将它们保存在符号表内,使他们成为一个编译期间的一个常量,没有读取内存的操作,效率也很高;


const修饰指针

分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer)

const char* p = "hello world";    //指针所指内容为常量,不能修改内容,即常量指针
char* const p = "hello world";    //指针为常量,不能修改指向,即指针常量
const char* const p = "hello world";    //指针和内容都为常量

const在*前,表明所指内容是常量,不能修改内容

const在*后,表明指针是常量,不能修改指向

使用常量指针作函数参数,既避免了拷贝,又避免了函数对值的修改,当不想传入参数时可以nullptr作缺省


const修饰引用

指向常量的引用(reference to const),const引用不能通过该引用修改所引用的对象

非const的变量可以被reference to const引用,const变量不能被非const reference引用

使用引用做参数时,如果不希望原数据被修改,应该添加const,既避免了拷贝,又避免了函数对值的修改

//一个参数为reference to const的函数
//可以传int, const int, int&, const int&
//实际上是用传入的参数对var进行了初始化,以上类型都可以对const int&进行初始化
void func(const int& var){

}

int main()
{
	int var0 = 10;            //普通变量
	const int var1 = 10;        //const

	int& ref0 = var0;            //普通引用
	const int& ref1 = var0;        //const引用普通变量
	const int& ref2 = var1;        //const引用常量

	func(var0);
	func(var1);
	func(ref0);
	func(ref1);
	func(ref2);

    return 0;
}

const修饰类成员变量

const修饰的成员变量不能被修改

const修饰的非static成员变量,可以进行类内初始化,也可以在初始化列表里进行初始化,常量没有赋值的概念,赋值也不是初始化,初始化时,开辟内存和赋初值是同时完成的

const修饰的static成员可以在在类内声明,然后在类的实现文件内初始化

class ClassName
{
private:
	const int m_var0 = 10;        //类内初始化
	const char* const m_cstr = "hello world";    //类内初始化
	const int m_var1;
    const static double m_var2;

public:
	ClassName(int var1) :
		m_var1(var1)    //初始化列表
	{
	};
};


const double ClassName::m_var2 = 10.0; //位于实现文件内
 

const修饰类成员函数

const成员函数表示该成员函数不能修改类对象中成员变量

两个成员函数如果仅常量性不同,可以被重载

应该坚持逻辑上的const. 比如修改指针常量所指向的内容,虽然没有改指针,但却修改了内容;返回自身的属性时返回了引用,虽然没有修改却使得属性可以被修改.应该避免在const成员函数中做这样的事.

当非const成员函数可以复用const成员函数,但不要在const成员函数复用非const成员函数

const实例只能调用const成员函数

class ClassName
{

public:
	ClassName();

	void func();        //普通成员函数
	void func() const;    //const成员函数
};

const修饰返回值

一个类的成员函数返回类中的某个属性,但又不希望用户修改该属性时,使用const引用作为返回值,其它情况下很少用const修饰返回值

例:操作符重载返回数据

const int& operator[](int) const;


const_cast类型转换消除const

const_cast能够消除对象的const限定


mutable突破const限制

被mutable修饰的变量,将永远处于可变的状态,不受const限制

mutable只能修饰非静态数据成员

在一个const函数中,mutable修饰的变量可被修改

结构体变量或者类对象为const,mutable修饰的变量可被修改


Effective C++ 条款3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值