【问题标题】:Class Constructor is not getting called when creating a vector with class objects使用类对象创建向量时未调用类构造函数
【发布时间】:2017-10-31 17:38:02
【问题描述】:

我正在创建一个带有如下类对象的向量。

#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;
}

据我了解,将创建 2 个对象,其值为“1”。但是构造函数只被调用一次。当我打印对象的值时,两个对象都将 x 值打印为“1”。下面是输出。

myclass constructor
size : 2
1
1

我不明白为什么构造函数没有被调用两次。

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

我尝试在下面的类中编写复制构造函数

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

但它在编译时抛出以下错误。

vector.cpp:15:9: 注意:没有已知的参数 1 从‘const myclass’到‘myclass&’的转换 vector.cpp:10:9: 注意:myclass::myclass(int) 我的类(int a = 0):x(a) ^ vector.cpp:10:9:注意:参数 1 没有从“const myclass”到“int”的已知转换

2) 如果我们要创建该类的对象向量,是否有任何规则不应该定义复制构造函数?如果我们使用用户定义的类对象创建向量,我们应该遵循哪些规则?

【问题讨论】:

  • 正确的复制构造函数是myclass(const myclass &amp;obj)const 部分非常重要。
  • 你的拷贝构造函数不好。副本 CTOR 需要获取 myclass 对象的 constant 引用。不是参考。
  • @rodrigo:是的。我同意。但这不应该影响这个问题。
  • @kadina 嗯,下面的答案不同意你刚才所说的
  • 通过复制将项目添加到向量中。

标签: c++


【解决方案1】:

复制构造函数需要const 引用。使用myclass(const myclass &amp;obj) 作为复制构造函数。


据我了解,将创建 2 个对象,其值为“1”。但 构造函数只被调用一次。

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


那么图片从输出中就清晰了:

myclass constructor
Copy Constructor
Copy Constructor
size : 2
1
1

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

【讨论】:

  • 这是否意味着将创建一个对象而其余对象将被复制构造?
  • 看起来确实如此
  • 如果我们使用用户定义的类对象创建向量,我们应该遵循什么规则?
  • @kadina:当然有! The rule of three or the rule of five.
  • @kadina 如果您打算将向量与== 进行比较,则只需实现operator==()。如果您尝试使用向量进行操作但未能在您的类上实现正确的操作,您将收到编译器错误。
【解决方案2】:

试试

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

至于第 2 部分,一般规则适用:创建复制构造函数,其中默认的逐个成员复制将失败。

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2019-07-25
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多