1

这两个构造函数有什么区别?

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)叫做?我什么时候使用这种类型的变量初始化?

谢谢。

4

3 回答 3

6

第一个是使用进行初始化initialization-list,第二个是使用赋值运算符进行赋值

推荐第一个!

BasePoint(int px, int py) : x(px), y(py) {}
                          ^^^^^^^^^^^^^ this is called initialization-list!

阅读此常见问题解答:我的构造函数应该使用“初始化列表”还是“赋值”?

常见问题解答以:

初始化列表。事实上,构造函数通常应该初始化初始化列表中的所有成员对象。进一步讨论了一个例外 [...]

阅读完整答案。

于 2011-03-10T06:40:16.800 回答
3

x(px), y(py) 叫什么?

这些被称为初始化列表。您实际上在做的是复制pxtoxpyto的值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.
 }
于 2011-03-10T06:43:21.620 回答
0
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){}
于 2011-03-10T06:56:06.790 回答