这两个构造函数有什么区别?
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)
叫做?我什么时候使用这种类型的变量初始化?
谢谢。
这两个构造函数有什么区别?
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)
叫做?我什么时候使用这种类型的变量初始化?
谢谢。
第一个是使用进行初始化initialization-list
,第二个是使用赋值运算符进行赋值。
推荐第一个!
BasePoint(int px, int py) : x(px), y(py) {}
^^^^^^^^^^^^^ this is called initialization-list!
阅读此常见问题解答:我的构造函数应该使用“初始化列表”还是“赋值”?
常见问题解答以:
初始化列表。事实上,构造函数通常应该初始化初始化列表中的所有成员对象。进一步讨论了一个例外 [...]
阅读完整答案。
x(px), y(py) 叫什么?
这些被称为初始化列表。您实际上在做的是复制px
tox
和py
to的值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.
}
BasePoint(int px, int py) : x(px), y(py) {}
这里你正在使用初始化列表,所以构造时对象不会进入主体并启动这些值。它通过不进入构造函数的主体来节省时间
this 的另一个用途是在调用派生类构造函数时。
如果你使用这样的语句
new derivedclass(a,b,c)
你可以写这个
derivedclass(int x,int y,int z):baseclass(a,b),h(z){}