来自 澳门金莎娱乐手机版 2019-11-14 16:50 的文章
当前位置: 金沙澳门官网网址 > 澳门金莎娱乐手机版 > 正文

澳门金莎娱乐手机版特别是用在函数前面与后面

打破C++ Const 的规则,打破cconst规则

从叁个C++生手改函数伊始

1 CString MyClass::GetStringValue() const
2 {
3   return m_strValue;    
4 }

那个值恐怕还还未有赋值,可以吗,那么作者先判断是还是不是为空,为空就赋值了

CString MyClass::GetStringValue() const
{
   if(m_strValue.IsEmpty())
      SetStringValue();

   return m_strValue;    
}

结果,编写翻译就但是,因为有个准则:const函数里面不能够调用非const函数。

 

见到下边包车型大巴编译错误:

error C2662: “MyClass::SetStringValue”: 不能将“this”指针从“const MyClass”转换为“MyClass &”

 

嘿嘿原本是这么:当大家定义了三个类的成员函数会暗中同意传进来三个this指针,可是假如是两个const 函数那么是否就传竟来叁个const的指针呢?所以本身想编译器见到是这么的:

CString MyClass::GetStringValue(const MyClass* this)
{
    if(this->m_strValue.IsEmpty())
        this->SetStringValue();

    return this->GetStringValue();
}

新生说多美滋(Dumex卡塔 尔(英语:State of Qatar)下,创制了三个static函数模拟一下:

CString MyClass::GetStringValueS(const MyClass* mcp)
{
    if(mcp->m_strValue.IsEmpty())
        mcp->SetStringValue();

    return mcp->GetStringValue();
}

编写翻译真的获取三个相通的不当:

error C2662: “MyClass::SetStringValue”: 不能将“this”指针从“const MyClass”转换为“MyClass &”

 

就此自个儿试着去打破const法规:

CString MyClass::GetStringValue()const
{
    MyClass * nonconstthis = (MyClass *)this;
    if(m_strValue.IsEmpty())
        nonconstthis->SetStringValue();

    return m_strValue;
}

结果编写翻译通过,施行也尚未难点。

 

故而有三个更动const_cast<>特地来做如此的事体:

CString MyClass::GetStringValue()const
{
    if(m_strValue.IsEmpty())
        const_cast<MyClass *>(this)->SetStringValue();

    return m_strValue;
}

 

最终,作者感觉,那样违反了const设计的初心,那样对于调用者是风流浪漫种期骗(违背公约:作者保管不改你卡塔尔,所以不引进那样使用。

Const 的平整,打破cconst准绳从二个C++生手改函数初步 1 CString MyClass::GetStringValue() const 2 { 3 return m_strValue; 4 } 这么些值或者还尚无赋值...

const放在前边有怎么着看头?

const 成员函数的宣示看起来怪怪的:const关键字只可以放在函数注解的尾巴,大致是因为任哪儿方都早已被占用了。

函数再次来到值接收"援引传递"的场归并十分的少,这种办法雷同只出现在类的赋值函数中,目标是为了落到实处链式表明。

正确的说const是修饰this指向的指标的

假诺给以"指针传递"格局的函数重临值加const修饰,那么函数重返值的始末不可能被纠正,该再次来到值只能被赋给加const修饰的同类型指针。比方函数

Char *str = GetString();

int Pop;

首要字:Const,Const函数,Const变量,函数前面包车型大巴Const

别的不会改正数据成员的函数都应有表明为const类型。倘若在编写制定const成员函数时,不慎改良了数据成员,大概调用了其余非const成员函数,编写翻译器将提议错误,那的确会升高程序的健壮性。以下顺序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编写翻译器将建议GetCount函数中的错误。

}

= c; // 不健康的链式赋值,但法定

int m_num;

f;

例如:

同理不要把函数A GetA 写成const A GetA,个中A为顾客自定义的数据类型。

public:

补充:

{

void Push;

3.const 成员函数

此地f函数其实有三个参数,第一个是A *const this, 另贰个才是int类型的参数

2.用const修饰函数的重回值

};

void StringCopy(char*strDestination, const char *strSource);

在 const成员函数中,this的种类是八个对准 const类类型对象的 const指针。既不可能纠正 this所指向的靶子,也不能够改动this所保存之处。

const修饰*this是精气神,至于说"表示该成员函数不会纠正类的数码。否则会编译报错"之类的传道只是三个现象,根源正是因为*this是const类型的

对于非内部数据类型的输入参数,应该将"值传递"的点子改为"const引用传递",指标是提高效能。举个例子将void Func 改为void Func(const A &a)。

举例说,大家定义了

{

难题是那样的情景融入,小编只可以将"const &"修饰输入参数的用法计算一下。

classA

Class Stack

关于Const函数的几点法规:

例如StringCopy函数:

万生机勃勃将赋值函数的回来值加const修饰,那么该重返值的从头到尾的经过区别意被改成。上例中,语句a= b = c 照旧正确,然而言语 = c 则是地下的。

==>

A & operate = (const A &other); // 赋值函数

Aa, b, c; // a, b, c 为A的对象

AcGePoint3dstartPoint() const;

举例不要把函数int GetInt 写成const int GetInt。

本文由金沙澳门官网网址发布于澳门金莎娱乐手机版,转载请注明出处:澳门金莎娱乐手机版特别是用在函数前面与后面

关键词: