類類型成員引用的問題

一個類中的成員變量是另一個類的類類型,賦值問題分爲引用,不引用兩類

如先定義TESTB類

class TESTB
{
public:
TESTB(){ b_ = 3.7; }
~TESTB(){}
void change(){ b_ = 9.0; }
float getb(){ return b_; }
private:
float b_;
};


在類TESTA中有一個TESTB類的對象作爲成員(先加TESTB類所在的頭文件)

1、不加引用

class TESTA
{
public:
TESTA(){}
~TESTA(){}
void assign(TESTB  tb){ tb_ = tb; }//這裏加不加引用隻影響執行效率不影響結果
public:
TESTB tb_;
};


(1)如執行了void assign(TESTB  tb){ tb_ = tb; }顯式賦值,則會賦給一個當前值

int main()
{
TESTB bb;//這裏bb的tb_爲3.7
bb.change();//這裏bb的tb_應爲9.0了

TESTA a;
a.assign(bb);//這裏執行了顯式賦值tb_ = tb
std::cout << a.tb_.getb() << std::endl;

return 0;
}

輸出結果爲9.0,因爲bb的tb_執行到9.0的時候將本身賦給a.tb_

當然不執行bb.change()的話,輸出結果爲3.7,因爲bb的tb_執行到3.7


結論:不加引用,顯式賦值,TESTA的對象的成員tb_得到的是實參的當前值


(2)如未執行void assign(TESTB  tb){ tb_ = tb; }顯式賦值,則會相當於新實例化一個對象,其變量都是TESTB構造函數中指定的

int main()
{
TESTB bb;//這裏bb的tb_爲3.7
bb.change();//這裏bb的tb_應爲9.0了

TESTA a;
//a.assign(bb);//這裏沒有執行顯式賦值tb_ = tb
std::cout << a.tb_.getb() << std::endl;

return 0;
}

輸出結果爲3.7


結論:不加引用,未顯式賦值,TESTA的對象的成員tb_相當於被初始化了,當然後面再顯式賦值時,再改變


2、加引用(此時會提示:必須初始化引用類型成員),因此在構造函數中初始化tb_變量,必須在構造函數中使用列表的形式初始化,不能在函數體中使用“=”

class TESTA
{
public:
TESTA(TESTB& b):tb_(b){ }//形參也必須是引用
~TESTA(){}
void assign(TESTB  tb){ tb_ = tb; }//這裏加不加引用隻影響執行效率不影響結果
public:
TESTB& tb_;//引用
};


此時相當於顯式賦值了,得到的是什麼值就是什麼值

int main()
{
TESTB bb;//3.7
bb.change();//9.0
TESTA a(bb);//將成員9.0的賦給a的成員
std::cout << a.tb_.getb() << std::endl;
return 0;
}


輸出結果是9.0,因爲賦值的時候已經是9.0了

再看

int main()
{
TESTB bb;
TESTA a(bb);//得到3.7
std::cout << a.tb_.getb() << std::endl;
bb.change();//bb改變
std::cout << a.tb_.getb() << std::endl;
return 0;
}

第一次輸出3.7,因爲得到了3.7的值;第二次輸出9.0,因爲是引用a.tb_相當於bb的別名,兩者同時變化


結論:1、加引用TESTB& tb_,必須在TESTA構造函數中以引用的形式傳入一個TESTB 對象,且以列表方式初始化;2、a.tb_相當於bb的別名,兩者同時變化


備註:至於TESTB& tb_;是私有還是公有的問題,隻影響訪問屬性,也可以在TESTA中構造get函數訪問,不影響上述結論


當我們要利用另一類對象的一些操作結果並在本類中改變該結果時,要採用引用的形式,見2

當我們要利用另一類對象的一些操作結果但是不想由本類的操作改變該結果時,不用引用,單寫一個賦值函數並執行,見1(2)

發佈了9 篇原創文章 · 獲贊 15 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章