קופי קונסטרקטור ומחלקה מוכלת - פלט לא מובן

קופי קונסטרקטור ומחלקה מוכלת - פלט לא מובן

תביטו בבקשה בקוד הבא:

קוד:
class Inner
{
public:
Inner()                   { cout << "Inner::Inner\n"; }
Inner(const Inner& other) { cout << "Inner::Inner(copy)\n"; }
~Inner()                  { cout << "Inner::~Inner\n"; }
};
class Outer
{
	Inner i;
public:
Outer()  { cout << "Outer::Outer\n"; }
Outer(const Outer&) { cout << "Outer::Outer(copy)\n"; }
~Outer() { cout << "Outer::~Outer\n"; }
};
void main()
{
Outer o1;
cout << "------------\n";
Outer o2(o1);
cout << "------------\n";
}

הפלט יוצא ככה:
קוד:
Inner::Inner
Outer::Outer
------------
Inner::Inner
Outer::Outer(copy)
------------
Outer::~Outer
Inner::~Inner
Outer::~Outer
Inner::~Inner

ומה שאני מבין הוא למה לא מודפסת השורה
Inner::Inner(copy)

הרי הקופי קונסטרקטור של האובייקט המוכל צריך לפעול לפני זה של האובייקט המכיל.
 

BravoMan

Active member
כי אף אחד לא מעתיק את האובייקט המוכל.

כתבת בנאי העתקה שלא מאתחל איבר i של מחלקה Outer.

בגלל שאיבר i מוגדר בצורה סטטית, האתחול שלו מתבצע אוטומטית, אבל אתחול אוטומטי יכול להיות רק ברירת מחדל - כלומר, נוצר אובייקט Inner חדש בעזרת בנאי ברירת מחדל של Inner.

לו רצית שתתבצע העתקה של Inner היית צריך לבצע אותה במפורש בבנאי העתקה של Outer בצורה כזו:
Outer(const Outer& other) : i(other.i) { cout << "Outer::Outer(copy)\n"; }
 
למעלה