关键字const的使用总结

1. const是一种类型修饰符,用于说明永不改变的对象,const对象一旦定义就无法再改变,所以const对象必须初始化。

 

2.顶层const与底层const区别

位于*左侧为底层const,位于*右侧为顶层const

顶层const意味着内存本身存储的数据是常量,

如int const a = 3;

即变量a是常量,不可改变。a = 5;//error

 

如int const *pa = &a;

即pa所指向内存a中数据为常量,不可改变

*pa = 5; // error

但是可以改变指针的指向

int b = 5; pa = &b; // ok

 

底层const意味着指针指向的内存中存储的数据为常量,不可改变,

如 int a = 3; 

int *const pa = &a;

即内存a中存储数据为常量,不可改变

int b = 5; pa = &b; // error

但是可以改变指针指向内存中数据

*pa = 5; // ok

 

注:底层const使用的前提是存在指针,针对的指针所指向内存的数据。

 

3.尽可能使用const,enum,inline替换#define

       宏:未经过C++的类型检测机制,是存在安全隐患的。

如果打算使用#define PI 3.14 ,请使用double const PI = 3.14

 

如果打算使用#define RED              RGB(0XFF,0X00,0X00)

                     #defineGREEN RGB(0X00,0XFF,0X00)

                     #defineBLUE             RGB(0X00,0X00,0XFF)

请使用enum COLOR

{

RED = RGB(0XFF,0X00,0X00),

GREEN = RGB(0X00,0XFF,0X00),

BLUE = RGB(0X00,0X00,0XFF)

};

 

如果打算使用#define squr(a)   a*a

请使用 double sque(doubleconst a) const { return a * a; }

 

如果打算书写函数

double sque(double const a) const { returna * a; }

double sque(double const a) { return a * a;}

请停止,完全可以使用一个函数double sque(double const a)const { return a * a; }

完成两个函数的功能,达到减少代码冗余的目的。

两个函数可以构成重载函数的关系,const对象只能调用const函数,非const函数同样可以调用const函数。

 

const具有安全性检测与数据保护功能,请尽量使用const关键字修饰变量,对象,引用,指针,函数。

 

5.防止const返回可以改变对象的行为

如下代码

struct CPoint

{

       inta;

       intb;

};

class Rectangle

{

public:

       CPoint& Get() const { return point;}

private:

       CPointpoint;

};

通过返回CPoint& 完全可以改变内部对象的状态。即返回内部对象的引用即相当于公开的内部对象,效果同public,破坏的封装。同const函数的作用完全违背。请避免变样使用。请使用下面的方法:

CPoint Get() const { return point;}

const CPoint& Get() const {returnpoint;}

 

6.mutable与valatile的使用

       说了const就不得不提mutable与volatile。

       const对象的值不能被改变,但是mutable成员的值却可以被修改

struct CPoint

{

       inta;

       mutableint b;

};

void change_point(CPoint const point) const

{

       ++point.a;     // error

       ++point.b;     // ok

}

代码中编译器经常对内存进行优化,volatile表示变量是易变的,表示可以被某些编译器未知的因素更改。尤其高并发时期。此时可使用volatile int a; 告诉优化器不要优化这个变量,请时时从内存中读取。


个人总结,仅供参考,如果有什么忽略的或者好的意见,请大家不吝赐教。

(ps :个人邮箱:wangqing10520@sina.com)。


 

 

C语言关键字const用于声明一个常量,即变量的值在声明后不能再被修改。被const修饰的变量只能读取其值,不能修改。 在引用的代码中,第四道代码声明了一个指针p,该指针指向一个常量int型变量a。这意味着p所指向的值不能被修改,同时p本身也不能指向其他的变量。因此,对p进行赋值或者修改*p的值都是非法的操作。 在引用的代码中,const修饰的变量a被声明为常量,即a的值不能被修改。当尝试修改a的值时,编译器会报错。 总结起来,C语言关键字const用于声明常量,常量的值在声明后不能再被修改。常量可以修饰变量或指针,使其成为只读或只指向特定变量的指针。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言关键字const详细讲解](https://blog.csdn.net/li1829146612/article/details/119636084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [[C语言]const关键字详解](https://blog.csdn.net/yjlyyj/article/details/125259458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C语言关键字const和指针的结合使用](https://download.csdn.net/download/weixin_38499706/12743173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值