#include <iostream>
class Bar
{
protected:
public:
int & x;
Bar(int & new_x)
:x(new_x)
{}
Bar & operator = (const Bar toCopy)
{
x = toCopy.x;
return *this;
}
};
int main()
{
int x1(1);
int x2(2);
Bar bar = Bar(x1);
std::cout << bar.x << std::endl;
bar = Bar(x2);
std::cout << bar.x << std::endl;
bar.x = 5;
std::cout << bar.x << std::endl;
std::cout << x1 << std::endl;
std::cout << x2 << std::endl;
}
輸出是:寫作`運營商=`非靜態基準部件類
1
2
5
5
2
我所試圖做的是副本x
和對象bar
內保存。
輸出表明,賦值運算符沒有完成它的魔術,無論是在複製方面,並採取新對象的值。我遵循this link。
將x
更改爲值而不是參考是不可能的,因爲在真正的程序x
是一個抽象類。
如果可能,請放棄使用堆分配。
編輯: 1.我意識到我只是屠殺了C++語言。我想向所有「C++ ian」講電腦道歉。我的動機是在堆棧上分配一個成員抽象變量。據我所知,它不能在堆棧上完成,因爲派生類的大小在編譯時並不知道。 2.好的...我總共是100B ...(不,謝謝,Sherlock!)。 「有效的C++編程」@rhalbersma是必須的。它包含必需品,但你不會在任何地方找到它們(複製構造,複製初始化),..在任何地方。
公共參考數據,通過非const引用或const值傳遞參數:您可能會開始閱讀Effective C++或類似的函數,以使您的基本類成員正確。 – TemplateRex
我從不使用引用作爲成員,我用指針代替,你仍然可以做所有事情(例如用&new_x初始化指針)等等。有些人喜歡引用作爲成員,因爲他們受到的限制很多... –