免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
c – static_cast(* this)和static_cast(* this)之間的區(qū)別

在以下代碼中(取自有效的C):

class A {  ....  char& operator[](std::size_t position)         // now just calls const op[]  {    return      const_cast<char&>(           // cast away const on op[]'s return type;        static_cast<const TextBlock&>(*this)   // add const to *this's type;          [position]                           // call const version of op[]      );  }  const char& operator[](int index) const  {     ...  }}//complete example, tested with VC 2010#include<iostream>#include<string>class TextBlock{public:    TextBlock(std::string st):text(st){};    TextBlock(char* cstr): text(cstr){};    TextBlock(const TextBlock& r)    {        std::cout<<"copy constructor called"<<std::endl;    }    char& operator[](int index)    {        std::cout<<"non-const operator"<<std::endl;        return const_cast<char&>(static_cast<const TextBlock>(*this)[index]);    }    const char& operator[](int index) const    {        std::cout<<"const operator"<<std::endl;        return text[index];    }private:    std::string text;};int main(){    TextBlock rt("hello");    std::cout<<rt[0]<<std::endl;}

在此代碼中,如果您從const TextBlock&更改static_cast;對(duì)于const TextBlock,這會(huì)導(dǎo)致operator []的非const版本被遞歸調(diào)用.任何人都可以解釋這背后的原因是什么(為什么const TextBlock導(dǎo)致不調(diào)用const成員函數(shù)operator []).

解決方法:

原因是因?yàn)?/p>

const A a();

A b();

是不同的對(duì)象,并且在CPP非常量對(duì)象中不能調(diào)用常量函數(shù),反之亦然;因此,您需要為const和非const對(duì)象分別聲明兩次相同的函數(shù).

cout << a[0] << endl;

是合法的,但是

cout << b[0] << endl;

不是.
因此,您應(yīng)該為非const對(duì)象重載[]運(yùn)算符.為了避免復(fù)制代碼,作者建議通過(guò)拋棄其constness來(lái)使用const對(duì)象的函數(shù).出于這個(gè)原因,你得到:

char& operator[](std::size_t position){     return const_cast <char &>( static_cast <const A &>(*this) [position] );}

換句話說(shuō),您只需將對(duì)象轉(zhuǎn)換為const

char& operator[](std::size_t position){     const A temp = *this;      //create a const object                                     //and assign current object to it     ....}

嘗試使用const obj的[]運(yùn)算符

char& operator[](std::size_t position){     const A temp = *this;      //create a const object                                     //and assign current object to it     return temp[position];     // call an overloaded operator []                                 // of the const function}

得到一個(gè)錯(cuò)誤,因?yàn)閏onst函數(shù)的[]運(yùn)算符返回const char&并且此函數(shù)返回char&amp ;.因此施放常數(shù)

char& operator[](std::size_t position){     const A temp = *this;      //create a const object                                 //and assign current object to it     return const_cast <char &>( temp[position] ); }

現(xiàn)在你完成了.問(wèn)題是:“如何

const A temp = *this;return const_cast <char &> (temp[position]);

成了這個(gè):

return const_cast <char &> ( static_cast <const A &> (*this)[position]);

?原因是當(dāng)你使用temp時(shí) – 你正在對(duì)const對(duì)象進(jìn)行非const的隱式轉(zhuǎn)換,因此你可以替換:

const A temp = *this;                                // implicit cast

const A temp = static_cast <const A &> (*this)        //explicit  

這也有效:

const A temp = const_cast <const A &> (*this) 

因?yàn)槟憧梢宰鲆粋€(gè)明確的演員 – 你不再需要一個(gè)臨時(shí)演員,因此:

return const_cast <char &> (static_cast <const A &>(*this)[position]);

這將從這個(gè)const-casted對(duì)象返回一個(gè)非const引用,該對(duì)象調(diào)用一個(gè)重載的運(yùn)算符[] :)正是因?yàn)檫@個(gè)原因你不能使用

return const_cast <char &> ((*this)[position]);

因?yàn)檫@是一個(gè)非const對(duì)象;因此,它將調(diào)用非成本函數(shù)(重載operator []),這將導(dǎo)致無(wú)限遞歸.

希望它有意義.

來(lái)源:https://www.icode9.com/content-4-415151.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++靜態(tài)成員函數(shù) 調(diào)用非靜態(tài)成員函數(shù)
Understanding C++ Casts
C++學(xué)習(xí)筆記-001
C++轉(zhuǎn)型操作符
C++的類型轉(zhuǎn)換
C++字符串分割
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服