c++ 中关键词 const — 函数

2022-12-21 0 468

const 是constant的简写,原意是维持不变的,难于发生改变的原意。const 在C++中是用以润色内建类别表达式,自表述第一类,核心成员表达式,codice,表达式参数。具体文本用语如下表所示:

1.一般表达式

1.1 情形一

const int a = 7; int b = a; // 恰当 a = 8; // 严重错误,无法发生改变

a被表述为两个自变量,因此能将a表达式给b,但无法给a再度表达式。对两个常量表达式是违规的事,即使a被C++指出是两个自变量,其值不容许修正。

1.2 情形二

#include<iostream> using namespace std; int main(void) { const int a = 7; int *p = (int*)&a; *p = 8; //透过操作方式符来修正 与否可取???? cout<<a; system(“pause”); return 0; }

对const表达式a,他们取表达式的门牌号并切换表达式给 对准int的操作方式符,接着借助*p = 8;再次对表达式a门牌号内的值表达式,接着输入查阅a的值。

从下面的增容询问处看见a的值被发生改变为8,但输入的结论依然是7。

c++ 中关键词 const — 函数
c++ 中关键词 const — 函数

从结论中他们能看见,C++接着指出a的值为一已经开始表述的7,因此对const a的操作方式就会造成下面的情形。因此一千万千万别轻而易举对const表达式想尽办法表达式,这会造成意料之外的犯罪行为。

2.操作方式符表达式

const 润色操作方式符表达式有下列四种情形。

2.1 情形一: const 润色操作方式符对准的文本,文本为不可表达式

const int *p = 8;

则操作方式符对准的文本 8 不可发生改变。简称左定值,即使 const 位于 * 号的左边。

2.2 情形二: const 润色操作方式符,操作方式符为不可表达式

int a = 8; int* const p = &a; *p = 9; // 恰当 int b = 7; p = &b; // 严重错误

对 const 操作方式符 p 其对准的内存门牌号无法够被发生改变,但其文本能发生改变。简称,右定向。即使 const 位于 * 号的右边。

2.3 情形三:const 润色操作方式符和操作方式符对准的文本,指针和操作方式符对准的文本都为不可表达式

int a = 8; const int * const p = &a;

这时,const p 的对准的文本和对准的内存门牌号都已固定,不可发生改变。

对以上四种情形,根据 const 位于 * 号的位置不同,我总结三句话便于记忆的话:”左定值,右定向,const润色不表达式”。

3.表达式参数

3.1 情形一 :值传递的 const 润色传递

#include<iostream> using namespace std; void Cpf(const int a) { cout<<a; // ++a; 是严重错误的,a 无法被发生改变 } int main(void) { Cpf(8); system(“pause”); return 0; }

3.2情形二:const 参数为操作方式符,能防止操作方式符被意外篡改

#include<iostream> using namespace std; void Cpf(int *const a) { cout<<*a<<” “; *a = 9; } int main(void) { int a = 8; Cpf(&a); cout<<a; // a 为 9 system(“pause”); return 0; }

3.3情形三:自表述类别的参数传递,需要临时第一类复制参数,对临时第一类的构造,需要调用构造表达式,比较浪费时间,因此他们采取 const 外加引用传递的方法

#include<iostream> using namespace std; class Test { public: Test(){} Test(int _m):_cm(_m){} int get_cm()const { return _cm; } private: int _cm; }; void Cmf(const Test& _tt) //const 外加引用传递的方法 { cout<<_tt.get_cm(); } int main(void) { Test t(8); Cmf(t); system(“pause”); return 0; }

首先:引用传递就很凸显出它的优势,引用传递传递的是实参的门牌号,而值传递则是实参的拷贝,相当于把实参复制了一份;对STL容器、类或者结构体等的参数传递而言,使用引用传递能避免调用拷贝构造表达式,能够节省表达式调用时的内存分配,减少表达式调用过程中的时间消耗,从而提高系统效率。

其次:在参数传递的过程中,如果不希望在使用的过程中发生改变实参的值,那么能在前面加上“const”关键字,保持良好的代码风格。

4.表达式codice

的时候润色的是表达式codice:

const char * GetString(void); const int GetInt(void); const float GetFloat(void); const double GetDdouble(void);

4.1 情形一:const 润色表达式codice(返回操作方式符)

如果给以“操作方式符传递”方式的表达式codice加 const 润色,那么表达式codice(即操作方式符)的文本无法被修正,该codice只能被赋给加const 润色的同类别操作方式符。

const char * GetString(void); //表达式 char *str = GetString(); //编译严重错误 const char *str = GetString();//恰当

4.2情形二:const 用于润色“返回引用”表达式的codice

如果表达式codice采用“值传递方式”,由于表达式会把codice复制到外部临时的存储单元中,加const 润色没有任何价值。例如把

表达式

写成

是没有意义的.

4.3情形三:在表达式名后面表示是 C++ 常核心成员表达式,该表达式无法修正第一类内的任何核心成员,只能发生读操作方式,无法发生写操作方式。

class People { public: int talk(void); int eat(void) const; // const 核心成员表达式 private: int m_age; }; int People::eat(void) const { ++m_age; // 编译严重错误,企图修正数据核心成员m_num talk(); // 编译严重错误,企图调用非const表达式 return m_age; }
const 第一类只能访问 const 核心成员表达式,而非 const 第一类能访问任意的核心成员表达式,包括 const 核心成员表达式.const 第一类的核心成员是不可修正的,然而 const 第一类透过操作方式符维护的第一类却是能修正的.const 核心成员表达式不能修正第一类的数据,不管第一类与否具有 const 性质.它在编译时,以与否修正核心成员数据为依据,进行检查.然而加上 mutable 润色符的数据核心成员,对任何情形下透过任何手段都可修正,自然此时的 const 核心成员表达式是能修正它的

参考:

C++ const用语小结 (欢迎大家拍砖)

C语言 const 润色表达式codice

c++ 中关键词 const --- 函数
上一篇: Git 是如何工作的
c++ 中关键词 const --- 函数
下一篇: Git中的分支

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务