什么时候没有调用c构造函数?

我有一种情况,似乎没有调用构造函数
#include <iostream>

using namespace std;

int main ()
{
    class yoyo
    {
        public:
        int i;
        yoyo()
        {
            i = 0;
            cout << "defaultly initialized to 0" << endl;
        }
        yoyo (int j) : i(j)
        {
            cout << "initialized to " << j << endl;
        }
    };

    int i;

    yoyo a;
    cout << "Hello1,i: " << a.i << endl;

    yoyo b(5);
    cout << "Hello2,i: " << b.i << endl;

    yoyo c = b;                                   /* 1 */
    cout << "Hello3,i: " << c.i << endl;

    return 0;
}

输出是:

defaultly initialized to 0
Hello1,i: 0
initialized to 5
Hello2,i: 5
Hello3,i: 5

(注意:Hello2和Hello3之间没有任何内容)

如果我将程序更改为如下所示:

#include <iostream>

using namespace std;

int main ()
{
    class yoyo
    {
        public:
        int i;
        yoyo()
        {
            i = 0;
            cout << "defaultly initialized to 0" << endl;
        }
        yoyo (int j) : i(j)
        {
            cout << "initialized to " << j << endl;
        }
    };

    int i;

    yoyo a;
    cout << "Hello1,i: " << b.i << endl;

    yoyo c; c = b;                                  /* 1 */
    cout << "Hello3,i: " << c.i << endl;

    return 0;
}

(唯一的区别在于他标有/ * 1 * /的行)

现在的输出是:

defaultly initialized to 0
Hello1,i: 5
defaultly initialized to 0
Hello3,i: 5

现在Hello2和Hello3之间有一个构造函数调用.我的问题是,为什么在第一种情况下没有(可见)构造函数调用

解决方法

如果是
yoyo c = b;

它被称为copy constructor.

在这种情况下

yoyo c; c = b;

这是被称为copy assignment的操作符.

如果您不提供其中任何一个,编译器将为您生成认版本.

如果要创建自己的复制构造函数,它可能如下所示:

yoyo(const yoyo& other)
    : i(other.i)
    { std::cout << "copy constructor initialized\n"; }

复制赋值运算符如下所示:

yoyo& operator=(const yoyo& other)
    {
        i = other.i;
        return *this;
    }

当然,它们都在类定义中定义.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...