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

时间:2011-03-10 06:38:14

标签: c++ constructor oop variable-initialization

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

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

感谢。

3 个答案:

答案 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的值复制到xpy复制到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){}