我听说在构造函数中使用初始化列表的好处是不会有类型对象的额外副本。但是对于T类构造函数中的以下代码,它意味着什么?如果我评论分配并使用初始化列表会有什么区别?
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
class X {
public:
X(float f_x = 0, float f_y = 0):x(f_x), y(f_y) {}
~X() {}
X(const X& obj):x(obj.x), y(obj.y) {}
friend ostream& operator << (ostream &os, X &obj);
private:
float x;
float y;
};
ostream& operator << (ostream &os, X &obj)
{ os << "x = " << obj.x << " y = " << obj.y; return os;}
class T {
public:
T(X &obj) : x(obj) { /* x = obj */ }
~T() { }
friend ostream& operator << (ostream &os, T &obj);
private:
X x;
};
ostream& operator << (ostream &os, T &obj)
{ os << obj.x; return os; }
int main()
{
X temp_x(4.6f, 6.5f);
T t(temp_x);
cout << t << endl;
}
答案 0 :(得分:6)
这正是你已经说过的。如果不使用初始化列表,则首先调用默认构造函数,然后调用赋值运算符。
在您的示例中,这是相对良性的(我认为编译器甚至可以对此进行优化)。但在其他情况下,根本无法避免初始化列表。想象一下,如果X
没有公共赋值运算符。
答案 1 :(得分:5)
如果您使用作业,则:
x
将首先默认构建&amp;
然后分配obj
。
费用是默认构造+分配
如果您使用会员初始化列表,则:
x
将使用obj
构建并初始化。
费用仅为构建
答案 2 :(得分:2)
T(X &obj) : x(obj) {}
将从obj复制构造x,而
T(X &obj){ x = obj; }
将构造一个默认的x,然后用obj。
中的值替换它如果您打算构造一个成员对象,则应该在初始化列表中进行。