C++ 什么时候是c++;没有调用构造函数?

C++ 什么时候是c++;没有调用构造函数?,c++,constructor,explicit-constructor,C++,Constructor,Explicit Constructor,我遇到的情况是,似乎没有调用构造函数: #include <iostream> using namespace std; int main () { class yoyo { public: int i; yoyo() { i = 0; cout << "defaultly initialized to 0" << endl;

我遇到的情况是,似乎没有调用构造函数:

#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;
}
(注: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: " << a.i << endl;

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

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

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

yoyo c = b;
yoyo c; c = b;
这就是所谓的

至于

yoyo c = b;
yoyo c; c = b;
被呼叫的是接线员

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


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

yoyo(const yoyo& other)
    : i(other.i)
    { std::cout << "copy constructor initialized\n"; }
yoyo& operator=(const yoyo& other)
    {
        i = other.i;
        return *this;
    }
它们都是在课程定义中定义的。

在第一种情况下:

yoyo c = b;   
调用
复制构造函数
,在本例中,编译器隐式为您生成该构造函数

 yoyo c = b; 
这称为复制初始化;将调用编译器生成的副本构造函数,并使用该副本初始化
c
。此外,将调用
c
的默认构造函数

c = b;
这里,这不是初始化,这是赋值。编译器生成的赋值运算符将在该行调用。

在代码中

yoyoc=b
将调用copy构造函数。如果希望看到它被调用,则必须明确定义它

例如:

您可以按如下方式重载赋值运算符

yoyo& operator=(yoyo& obj)
{
    i = obj.i;
    cout << "assignment operator" << endl;
}
yoyo和操作员=(yoyo和obj)
{
i=对象i;

您是否缺少跟踪默认复制构造函数和
operator=()
实现的功能。
yoyo c; //constructor
c = b;  //assignment operator for which only copying occurs
yoyo& operator=(yoyo& obj)
{
    i = obj.i;
    cout << "assignment operator" << endl;
}