簡體   English   中英

為什么我們需要引用成員的復制構造函數

[英]Why do we need a copy constructor for reference members

我不明白為什么我們需要一個復制構造函數(以..開頭),尤其是為了參考成員。

給定一個 class

class Foo {
   Obj &obj;
};

我現在必須編寫一個復制構造函數和=運算符(也許還有其他 5 個秘密的東西),否則它不會編譯。 為什么? 為什么編譯器能夠弄清楚它應該復制一個intstring而不是一個引用? 指針也一樣? 它認為我可能想要做什么? 我必須准確地寫出編譯器為每個其他屬性寫的內容。 如果我向 class 添加了一個新屬性,或者更糟的是,其他人添加了一個新屬性卻忘記將它添加到復制 ctor 和操作符,該怎么辦?

簡短的回答是:因為 C++ 標准是這樣說的。 但這不是一個非常有趣的答案。

為了得到更有趣的答案,我們可以問一個不同的問題:這種行為的基本原理是什么?

雖然我不聲稱知道對此的規范答案,但如果只是為了減少混淆,我不會感到驚訝。 作為成員的引用可能會出現意外行為,並且使用它們復制類可能會產生您意想不到的結果。

從技術上講,沒有什么能阻止編譯器誠實地將引用的成員從源復制到目標。 但是很多人會期望 class 代替“重新指向”引用(類似於指針)。 但是不能重復引用,其基本原理在“C++ 的設計和演變”中給出:

C++ 不允許您重新綁定引用的原因在 Stroustrup 的“C++ 的設計與演進”中給出:

...我過去曾被 Algol68 引用所困擾,其中 r1=r2 可以通過 r1 分配給所引用的 object,或者根據 r2 的類型為 r1 分配一個新的參考值(重新綁定 r1)。 我想在 C++ 中避免此類問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM