C++学习笔记——7. 你真的掌握const关键字的用法吗?(const用法总结)

2022-12-21 0 591

「责任编辑如是说了C++中const的用语,重新整理责任编辑的其原因是他们前段时间常常被流程中的const用语帕吕奥,决意写一则放到这儿以供他们翻查和梦境,对阿宝反之亦然适用于。 」

责任编辑参照该文:https://blog.csdn.net/Eric_Jo/article/details/4138548?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

“在介绍const的来龙去脉后要天马行空采用,这将为你增添无穷无尽好处。”写作元老写的标识符的确辨认出constURL再次出现的地方性太灵巧明快了,写与不写常常有著显著的促进作用差别。

一、const在类中的采用

1.润色核心成员表达式

const润色类的核心成员表达式,则表示核心成员自表达式,无法被修正,与此同时它根本无法在调用条目中表达式。

class A { const int nValue; //核心成员自表达式无法被修正 A(int x): nValue(x) { } ; //根本无法在调用条目中表达式 }

2.润色核心成员表达式

const润色类的核心成员表达式,则该核心成员表达式无法修正类中任何人非const核心成员表达式。通常写在表达式的最终来润色。

class A { void function()const; //常核心成员表达式, 它不改变对象的核心成员表达式,也无法调用类中任何人非const核心成员表达式。 }

对于const类对象/指针/引用,根本无法调用类的const核心成员表达式,因此,const润色核心成员表达式的最重要促进作用就是限制对于const对象的采用。

①const核心成员表达式不被允许修正它所在对象的任何人一个数据核心成员。②const核心成员表达式能够访问对象的const核心成员,而其他核心成员表达式不可以。

3.润色类对象/对象指针/对象引用

const润色类对象则表示该对象为自表达式对象,其中的任何人核心成员都无法被修正。对于对象指针和对象引用也是一样。

const润色的对象,该对象的任何人非const核心成员表达式都无法被调用,因为任何人非const核心成员表达式会有修正核心成员表达式的企图。

class AAA { void func1(); void func2() const; } const AAA aObj; aObj.func1(); //错误 aObj.func2(); //正确 const AAA* aObj = new AAA(); aObj-> func1(); //错误 aObj-> func2(); //正确

二、const在表达式中的采用

1. const润色表达式参数

传递过来的参数在表达式内不可以改变(无意义,因为Var本身就是形参)

void function(const int Var);

参数指针所指内容为自表达式不可变

void function(const char* Var);

参数指针本身为自表达式不可变(也无意义,因为char* Var也是形参)

void function(char* const Var);

参数为引用,为了增加效率与此同时防止修正。润色引用参数时:

void function(const Class& Var); //引用参数在表达式内不可以改变 void function(const TYPE& Var); //引用参数在表达式内为自表达式不可变

这样的const引用传递和最普通的表达式按值传递的效果是一样的。他禁止对引用的对象的一切修正,唯一不同的是按值传递会先建立一个类对象的副本,然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效。另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性, 且是不可见的,他短时间存在一个局部域中,所以无法采用指针,只有引用的const传递能够捕捉到这个家伙。

2. const润色表达式返回值

const润色表达式返回值其实用的并多,含义和const润色普通表达式以及指针的含义基本相同。

const int fun1() //这个其实无意义,因为参数返回本身就是表达式。 const int * fun2() //调用时 const int *pValue = fun2(); //我们可以把fun2()看作成一个表达式,即指针内容不可变。 int* const fun3() //调用时 int * const pValue = fun2(); //我们可以把fun2()看作成一个表达式,即指针本身不可变。

通常情况下,表达式的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常不建议用const润色表达式的返回值类型为某个对象或对某个对象引用的情况。其原因是:如果返回值为某个对象为const(const A test = A 实例)或某个对象的引用为const(const A& test = A实例) ,则返回值具有const属性,则返回实例根本无法访问类A中的公有(保护)数据核心成员和const核心成员表达式,并且不允许对其进行表达式操作,这在通常情况下很少用到。

三、const在指针中采用

指针本身是自表达式不可变

char* const pContent;

指针所指向的内容是自表达式不可变

const char *pContent;

两者都不可变

const char* const pContent;

还有其中差别方法,沿着*号划一条线:

如果const位于*的左侧,则const就是用来润色指针所指向的表达式,即指针指向为自表达式;

如果const位于*的右侧,const就是润色指针本身,即指针本身是自表达式。

四、const定义自表达式

const润色表达式,以下两种定义形式在本质上是一样的。它的含义是:const润色的类型为TYPE的表达式value是不可变的。

TYPE const ValueName = value; const TYPE ValueName = value;

将const改为外部连接,促进作用于扩大至全局,编译时会分配内存,并且可以不进行调用,仅仅作为声明,编译器认为在流程其他地方性进行了定义.

extend const int ValueName = value;

五、补充

要避免最通常的表达式操作错误,如将const表达式表达式;在参数中采用const应该采用引用或指针,而不是通常的对象实例;const在核心成员表达式中的三种用语(参数、返回值、表达式)要很好的采用;不要轻易的将表达式的返回值类型定为const; 除了重载操作符外通常不要将返回值类型定为对某个对象的const引用;任何人不会修正数据核心成员的表达式都应该声明为const 类型;类内部的自表达式限制:采用这种类内部的调用语法的时候,自表达式必须是被一个自表达式表达式;调用的整型或枚举类型,而且必须是static和const形式;如果在非const核心成员表达式中;this指针只是一个类类型的;如果在const核心成员表达式中,this指针是一个const类类型的;如果在volatile核心成员表达式中,this指针就是一个volatile类类型的。如何调用类内部的自表达式:一种方法就是static 和 const 并用,在外部调用,例如:
class A { public: A() {} private: static const int i; } //注意必须是静态的 const int A::i=3; //另一个很常见的方法就是调用条目: class A { public: A(int i=0):test(i) {} private: const int i; } //还有一种方式就是在外部调用,

new返回的指针必须是const类型的。

相关文章

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

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