C++程序的输出| 13套
预测以下 C++ 程序的输出。
#include
using namespace std;
class A
{
// data members of A
public:
A () { cout << "\n A's constructor"; /* Initialize data members */ }
A (const A &a) { cout << "\n A's Copy constructor"; /* copy data members */}
A& operator= (const A &a) // Assignemt Operator
{
// Handle self-assignment:
if(this == &a) return *this;
// Copy data members
cout << "\n A's Assignment Operator"; return *this;
}
};
class B
{
A a;
// Other members of B
public:
B(A &a) { this->a = a; cout << "\n B's constructor"; }
};
int main()
{
A a1;
B b(a1);
return 0;
}
输出:
A's constructor
A's constructor
A's Assignment Operator
B's constructor
输出的第一行由语句“A a1;”打印出来。在主()中。
第二行在 B 的成员'a' 初始化时打印。这个很重要。
第三行由语句“this->a = a;”打印在 B 的构造函数中。
第四行由 B 的构造函数中的 cout 语句打印。
如果我们仔细查看上面的代码,B 类的构造函数效率不高,因为成员'a' 首先使用默认构造函数构造,然后使用赋值运算符复制参数中的值。当 A 类很大时,这可能是一个问题,这通常是许多实际类的情况。请参阅以下优化代码。
#include
using namespace std;
class A
{
// data members of A
public:
A() { cout << "\n A's constructor"; /* Initialize data members */ }
A(const A &a) { cout << "\n A's Copy constructor"; /* Copy data members */ }
A& operator= (const A &a) // Assignemt Operator
{
// Handle self-assignment:
if(this == &a) return *this;
// Copy data members
cout << "\n A's Assignment Operator"; return *this;
}
};
class B
{
A a;
// Other members of B
public:
B(A &a):a(a) { cout << "\n B's constructor"; }
};
int main()
{
A a;
B b(a);
return 0;
}
输出:
A's constructor
A's Copy constructor
B's constructor
类 B 的构造函数现在使用初始化列表来初始化其成员“a”。当使用 Initializer list 时,B 类的成员'a' 是直接从参数初始化的。因此减少了对 A 的构造函数的调用。
一般来说,使用 Initializer List 来初始化一个类的所有成员是一个好主意,因为它节省了一次额外的成员分配。有关更多详细信息,请参阅本文的第 6 点。