📜  C++程序的输出| 13套

📅  最后修改于: 2022-05-13 01:56:10.872000             🧑  作者: Mango

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 点。