国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

淺談const變量賦值報(bào)錯(cuò)分析

2020-05-23 14:19:27
字體:
供稿:網(wǎng)友
在類中 只有靜態(tài)變量能賦值 如果你不賦值 編譯器會(huì)認(rèn)為你這個(gè)變量根本沒用 不能被修改 又沒有初始值 兩個(gè)辦法 在構(gòu)造函數(shù)的初始化列表賦值 或者在const前面加一個(gè)static
 

從變量到常量的賦值是合法C++的語法約定的, 

如從char 到const char順暢; 
但從char **到 const char **編譯器就會(huì)報(bào)錯(cuò):

 

復(fù)制代碼代碼如下:

error: invalid conversion from `char**' to `const char**'

 

示例:
 

  1. int main(int argc, char *argv[]) 
  2.   char a = '1'
  3.   const char b = a; 
  4.  
  5.   char * a2 = "12345"
  6.   const char * b2 = a2; 
  7.  
  8.   char** a3 = NULL; 
  9.  
  10.   //const char** b3 = a3; //error 
  11.    char** const c3 = a3; //ok 
  12.    charconst * d3 = a3; //ok 
?

原因: 

const char** b3 說明 b3的指針可以變更,可以再指向另外一個(gè)地址; 
b3和a3都是unqualified的,但b3指向的對(duì)象類型為pointer to const char, 
a3指向的對(duì)象類型為 pointer to char,兩者是不相容類型, 
不符合兩操作數(shù)必須指向相容類型的規(guī)定,因此賦值非法。 
更詳細(xì)的解釋詳見參考資料1;

而char** const c3 = a3;正確,則是因?yàn)閏onst限制了c3指針的地址變更,即它指向了a3,就不再能變更指向其它指針了;這就限制了指針地址變更可能發(fā)生的潛在問題;

當(dāng)然這時(shí)候,使用一個(gè)強(qiáng)制類型轉(zhuǎn)換,可以解決這個(gè)編譯錯(cuò)誤:

 

復(fù)制代碼代碼如下:

    const char** b3 = const_cast<const char**>(a3); // ok

 

但轉(zhuǎn)換后的代碼再出現(xiàn)問題就很難排查了;

強(qiáng)制類型轉(zhuǎn)換的潛在問題

看以下示例:
 

  1. class Foo { 
  2. public
  3.  Foo(){ 
  4.    i = 1; 
  5.  } 
  6.  void modify(){// make some modification to the this object 
  7.    i = 2; 
  8.  }  
  9.  void print() const { 
  10.    cout << "Foo_i:" << i << endl; 
  11.  } 
  12. private
  13.  int i; 
  14. }; 
  15.  
  16. //演示潛在的危險(xiǎn)   
  17. //error: invalid conversion from `Foo**' to `const Foo**' 
  18. ///////////////////////////////////////////////////////// 
  19. int main(int argc, char *argv[]) 
  20.   const Foo x; 
  21.   Foo* p; 
  22.  
  23.   //const Foo ** q = &p; //q now points to p; this is (fortunately!) an error 
  24.   const Foo ** q = const_cast<const Foo **>(&p);  
  25.   *q = &x; // p now points to x 
  26.   p->modify(); // Ouch: modifies a const Foo!!  
  27.   x.print(); // print: Foo_i:2 
  28.   return 0; 
?

我們定義了一個(gè)常量的Foo,常量Foo方法打印出來的永遠(yuǎn)為1; 

Foo**到const Foo **的轉(zhuǎn)換報(bào)錯(cuò), 

通過一個(gè)強(qiáng)轉(zhuǎn)符讓編譯通過, 

最后的x.print()的結(jié)果是2;這樣的潛在危險(xiǎn)在正式的項(xiàng)目代碼中就很難發(fā)現(xiàn); 

很難會(huì)想到一個(gè)const對(duì)象還能夠變更;

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 延安市| 漾濞| 博乐市| 乡宁县| 舞阳县| 新民市| 革吉县| 乌海市| 普陀区| 胶南市| 泰安市| 新乡市| 绍兴市| 大冶市| 休宁县| 邮箱| 铜川市| 喜德县| 农安县| 穆棱市| 甘孜县| 新巴尔虎右旗| 海盐县| 琼中| 南平市| 株洲市| 克山县| 梁山县| 峡江县| 浏阳市| 丽水市| 逊克县| 皋兰县| 册亨县| 崇明县| 城固县| 浦县| 松潘县| 梁河县| 岫岩| 山阴县|