C++ 使用类对象创建向量时未调用类构造函数

C++ 使用类对象创建向量时未调用类构造函数,c++,C++,我正在用类对象创建一个向量,如下所示 #include <iostream> #include <vector> using namespace std; class myclass { public: myclass(int a = 0) : x(a) { cout << "myclass constructor" << endl; } int

我正在用类对象创建一个向量,如下所示

#include <iostream>
#include <vector>

using namespace std;

class myclass
{
    public:

        myclass(int a = 0) : x(a)
        {
            cout << "myclass constructor" << endl;
        }

        int x;
};

int main()
{
    vector<myclass> v(2, 1);

    cout << "size : " << v.size() << endl;
    cout << v[0].x << endl;
    cout << v[1].x << endl;
}
我不明白为什么构造函数没有被调用两次

1) 这里是否调用了复制构造函数

我尝试在类中编写复制构造函数,如下所示

myclass(myclass &obj)
{
    x = obj.x;
    cout << "Copy Constructor" << endl;
}
myclass(myclass&obj)
{
x=对象x;

cout复制构造函数需要一个
const
引用。对复制构造函数使用
myclass(const myclass&obj)


据我所知,将创建两个值为“1”的对象。但是 构造函数只被调用一次

构造函数被调用一次,然后对象被复制多次


然后,从输出中可以清楚地看到图片:

myclass constructor
Copy Constructor
Copy Constructor
size : 2
1
1

请记住,向量有时也会调整大小并必须复制元素。

复制构造函数需要一个
const
引用。对于复制构造函数,请使用
myclass(const myclass&obj)


据我所知,将创建两个值为“1”的对象。但是 构造函数只被调用一次

构造函数被调用一次,然后对象被复制多次


然后,从输出中可以清楚地看到图片:

myclass constructor
Copy Constructor
Copy Constructor
size : 2
1
1
请记住,向量也会调整大小,有时必须复制元素。

试试看

myclass(const myclass &obj)
    {
        x = obj.x;
        cout << "Copy Constructor" << endl;
    }
myclass(const myclass&obj)
{
x=对象x;
试试看

myclass(const myclass&obj)
{
x=对象x;


正确的复制构造函数应该是
myclass(constmyclass&obj)
const
部分非常重要。你的复制构造函数不好。复制构造函数需要对myclass对象进行常量引用。而不是引用。@rodrigo:是的。我同意。但这不应该影响这个问题。@kadina好吧,下面的答案与你刚才说的不一致。复制对象是通过复制来添加到向量的正确的复制构造函数应该是
myclass(constmyclass&obj)
常量部分非常重要。你的复制构造函数不好。复制构造函数需要对myclass对象进行常量引用。而不是引用。@rodrigo:是的,我同意。但这不应该影响这个问题。@kadina好吧,下面的答案与你刚才说的不一致,复制对象是通过复制来添加到向量的。Doe这意味着一个对象将被创建,其余的对象将被复制构造?这看起来很明显,如果我们使用用户定义的类对象创建向量,我们应该遵循哪些规则?@kadina:当然有!@kadina您只需要实现
操作符==()
如果您打算将向量与
==
进行比较。如果您尝试对向量进行操作,但未能在类上实现正确的操作,您将得到一个编译器错误。这是否意味着将创建一个对象,并复制构造其余的对象?这显然看起来是正确的。如果是,我们应该遵循哪些规则使用用户定义的类对象创建向量?@kadina:当然有!@kadina如果要将向量与
==
进行比较,只需实现
运算符==()
。如果尝试使用向量的操作,但未能在类上实现正确的操作,则会出现编译器错误。