这两个构造函数有什么区别?
int x, y; //position
BasePoint(int px, int py) : x(px), y(py) {}
和
int x, y; //position
BasePoint(int px, int py)
{
x = px;
y = py;
}
x(px), y(py)
被叫什么?我什么时候使用这种类型的变量初始化?
感谢。
答案 0 :(得分:6)
第一个是使用initialization-list
进行初始化,第二个是使用赋值运算符进行赋值。
推荐第一个!
BasePoint(int px, int py) : x(px), y(py) {}
^^^^^^^^^^^^^ this is called initialization-list!
阅读此常见问题解答:Should my constructors use "initialization lists" or "assignment"?
常见问题解答的答案始于:
初始化列表。事实上, 构造函数应该初始化为 规则中的所有成员对象 初始化列表。一个例外是 进一步讨论[...]
阅读完整的答案。
答案 1 :(得分:3)
什么是x(px),y(py)叫什么?
这些称为初始化列表。您实际在做的是将px
的值复制到x
和py
复制到y
。
用途:
class foo
{
private:
int numOne ;
public:
foo(int x):numOne(x){}
};
class bar : public foo
{
private:
int numTwo;
public:
bar(int numTwo): foo( numTwo ), // 1
numTwo(numTwo) // 2
{}
};
bar obj(10);
1。请注意,派生构造函数的参数可以传递给基类构造函数。
2. 在这种情况下,编译器可以解析哪一个是参数,哪一个是成员变量。如果,这需要在构造函数中完成,那么 -
bar::bar(int numTwo) : foo( numTwo)
{
this->numTwo = numTwo; // `this` needs to be used. And the operation is called assignment. There is difference between initialization and assignment.
}
答案 2 :(得分:0)
BasePoint(int px, int py) : x(px), y(py) {}
这里你正在使用初始化列表 所以构造时的对象不会进入体内并启动那些值。通过不进入构造函数体来节省时间
另一个用途是调用派生类构造函数。
如果你使用像
这样的语句new derivedclass(a,b,c)
你可以写这个
derivedclass(int x,int y,int z):baseclass(a,b),h(z){}