2013-08-23 34 views
0

的函數聲明常量我有這些代碼什麼是最好的,以及如何在C++

#include <iostream> 
using namespace std; 
class Ex; 
class Exx; 

class Ex { 
public: 
    int _val; 
    int const *_p_val; 
    void setPtrVal(int * const &val) { 
     _p_val=val; 
    } 
}; 

class Exx { 
public: 
    Ex const *_ex; 
    void setEx(Ex const &ex) 
    { 
     _ex=&ex; 
    } 
}; 

int main() 
{ 
    Ex x; 
    int i=10; 
    x.setPtrVal(&i); 
    Exx xx; 
    xx.setEx(x); 
    int y=20; 
    cout<<*(xx._ex->_p_val)<<endl; 
    x.setPtrVal(&y); 
    cout<<*(xx._ex->_p_val)<<endl; 
    cout<<*x._p_val<<endl; 
    return 0; 
} 

1:你可以看到,防爆X防爆類的常量。和Ex const * _ex;是一個指針,指向只有出現常量。爲什麼以上的一切都好?

2:常量在void setEx(Ex const & ex)只是意味着你不能在函數體中修改ex?

3:如果我想要類似上面的原型(假設爲安全原因),如何修復成員指針變量的setter函數?

好的。如果Ex const * _ex;變成Ex * _ex;所以,在setter函數中,我想要一個原型不會修改參數對象,就像上面一樣。功能體如何成爲?

+0

你的問題不是很清楚 – davids

+0

好的。我更新了我的最後一個問題 – quano1

回答

0
  1. 的指針(或引用)const不必指向一個const對象。它只是意味着它不能用來修改它指向的對象;因此它可以安全地指向const或非const對象。

  2. 是的。具體來說,這意味着作爲函數參數傳遞的引用不能用於修改對象。

  3. 如果不需要修改,最好包含const。這將防止意外修改,並允許您指向const對象。

+0

謝謝。但我已經更新了我的問題 – quano1

+0

@ quano1:對不起,我不知道第三個問題現在問什麼。 –

+0

抱歉我的urgly英語:D我修好了,希望你能理解 – quano1

0

首先,你實際上正確,書寫void setEx(Ex const &ex)手段裏面setEx,參數&ex是CV-合格。

這並不意味着什麼指向(或在您的情況下引用)必然是調用代碼中已經const的東西。

然後,到什麼是最好的,以及它取決於你實際上想要的。如果您爲您的成員編寫Ex const* ex;,這意味着一旦通過對象初始化設置它,對象本身(通過其成員函數)就不能修改指向的數據。它仍然可以爲指針指定一個新值(使其指向其他地方),但這意味着它無法修改指向的內容。

最後,它歸結爲你想要的。

  • 如果數據不應該修改:Ex const * ex;將強制執行該操作。
  • 如果不應該修改指針:Ex * const ex;將強制執行該操作。
  • 如果指針和數據必須保持不變:Ex const * const ex;將會執行。
+0

謝謝。但我已經更新了我的問題 – quano1

相關問題