![](/img/trans.png)
[英]Why is my copy constructor being called when I return *this from a class member function?
[英]Why isnt the copy constructor of member class called?
class member
{
public:
member()
{
cout<<"Calling member constr"<<'\n';
}
member(const member&)
{
cout<<"Calling member copy constr"<<'\n';
}
};
class fred
{
public:
fred()
{
cout<<"calling fred constr"<<'\n';
}
fred(const fred &)
{
cout<<"Calling fred copy constr"<<'\n';
}
protected:
member member_;
};
int main()
{
fred a;
fred b=a;
}
Output:
Calling member constr
calling fred constr
**Calling member constr**
Calling fred copy constr
因為你沒有調用member
的復制構造函數。 如果覆蓋fred
的默認復制構造函數,則需要顯式復制成員。
fred(const fred& other) : member_(other.member_) {
cout<<"Calling fred copy constr"<<'\n';
}
它未被調用,因為您明確要求編譯器不要調用它。 當你為類fred
定義了自己的拷貝構造函數時,你基本上告訴編譯器你想要把事情掌握在自己手中並自己進行復制。 由於您沒有在fred
的復制構造函數中復制member_
,因此不會復制它。
如果你擺脫了fred
的拷貝構造函數的顯式定義,編譯器將為你提供一個隱式的,它將調用member
的拷貝構造函數來復制member_
。
如果你堅持自己定義fred
的拷貝構造函數,你必須自己復制member_
,正如KennyTM建議的那樣。
如果類A具有類B成員並且您明確地為類A實現了副ctor,則必須顯式復制那里的成員,在這種情況下調用B copy ctor,否則B成員將是默認構造的,而不是復制構造。
在這種情況下,您必須明確地調用它。 因為,你有重載的構造函數。
順便說一句,當我看到“Fred”時,它會讓我想起這個有用的資源,請進一步了解C ++構造函數: http : //www.parashift.com/c++-faq-lite/ctors.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.