1

为什么链接构造函数时以下内容不起作用:

#include <iostream>
#include <vector>

class cls {
public:
    cls()           {cls(5);}       // want to resize v to 5
    cls(int n)      {v.resize(n);}
    std::vector<int> v;
};

int main(int argc, const char* argv[]) {
    cls x, y(5);
    std::cout << x.v.size() << std::endl;   // prints 0 <- expected 5
    std::cout << y.v.size();                // prints 5
    return 0;
}

演示:http: //ideone.com/30UBzS

我预计这两个对象v的大小都是 5。怎么了?

我想这样做的原因是因为单独编写cls()cls(n)ctor 会重复很多代码。

4

4 回答 4

2

cls(5);在构造函数内部调用cls::cls()并没有做你认为它正在做的事情。它正在使用第二个cls构造函数创建一个临时变量,该构造函数在;.

您可以使用 C++11 的委托构造函数来实现您想要的:

cls() : cls(5) { }

如果您没有支持 C++11 的编译器,则可以将通用初始化提取到另一个函数中,并让两个构造函数都调用它:

class cls {
public:
    cls()           { init(5); }
    cls(int n)      { init(n); }
    std::vector<int> v;
private:
    void init(int n) { v.resize(n); }
};
于 2013-05-11T17:55:17.600 回答
0

你应该改变

cls()  {cls(5);} 

cls()  {v.resize(5);} 

否则,您将cls在构造函数中创建新的临时对象并忽略它。


或者如果你想delegate the constructor(C++11)这样做

cls() : cls(5)  {} 
//   ^^   ^
//        | use cls(int n)

委托构造函数只允许在member initialization构造函数列表中。

于 2013-05-11T17:50:17.410 回答
0

这是您需要的:

class cls
{
public:
       cls()
       :
       v( 5 ){}               // create v that contains 5 elements ( each initialized to 0 ) - note: this is NOT resizing

        explicit cls( const int size )
        :
        v( size ){}
private:       
        std::vector<int> v;
};

当然,如果您需要调整活体对象的大小功能,则需要此线程中已经提到的“调整大小”方法。

于 2013-05-11T18:02:53.820 回答
0

cal(5)创建一个完全不同的对象,实际上它是一个临时的意思,该对象将在其封装表达式结束时被销毁。或者由于编译器优化,它可能根本不会被调用。

但除此之外,构造函数调用只影响临时对象,而不影响调用构造函数的原始对象。

如果您的目的是使代码更短,您应该创建一个成员函数来执行此操作(假设您的编译器不支持 C++11,在这种情况下您可以简单地使用委托构造函数功能):

class cls
{
    void resize(int n)
    {
        v.resize(n);
    }

    public:
        cls()           { resize(5); }
        cls(int n)      { resize(n); }
        std::vector<int> v;
};
于 2013-05-11T18:03:23.553 回答