gpt4 book ai didi

c++ - 没有默认构造函数的初始化赋值

转载 作者:行者123 更新时间:2023-11-30 03:38:13 26 4
gpt4 key购买 nike

在这个程序中,我完全理解为什么 main 函数的第一部分失败并需要注释 - 在我在 TestingClass 中实现值 ctor 之后没有隐式默认 ctor。完全符合逻辑。然而,我有点惊讶地发现第二部分(test2 对象的创建)成功得很好,至少在 gcc 4.8.4 中是这样。

#include <iostream>
using namespace std;

class TestingClass
{
public:
TestingClass(int inVal)
{
val = inVal;
}

int val;
};

TestingClass testingCreator()
{
return TestingClass(100);
}

int main()
{
/*
TestingClass test1;
test1 = testingCreator();
cout << "Test1: " << test1.val << endl;
*/

TestingClass test2 = testingCreator();
cout << "Test2: " << test2.val << endl;
}

想想也是有道理的,因为对象test2在没有被构造/初始化的情况下永远不会存在,但是大多数人认为这样的初始化只是一行上的声明和赋值。但很明显,初始化比这更特殊,因为这段代码有效。

这是标准的 C++ 吗?是否保证跨编译器工作?我感兴趣的是,以这种方式初始化与仅声明(使用默认构造函数)然后分配(通过在全局函数中创建的临时对象)有何不同。

更新:添加了一个复制构造函数和第三个明确使用复制构造函数的案例。

#include <iostream>
using namespace std;

class TestingClass
{
public:
TestingClass(const TestingClass &rhs)
{
cout << "In copy ctor" << endl;
this->val = rhs.val + 100;
}
TestingClass(int inVal)
{
val = inVal;
}

int val;
};

TestingClass testingCreator()
{
return TestingClass(100);
}

int main()
{
/*
TestingClass test1;
test1 = testingCreator();
cout << "Test1: " << test1.val << endl;
*/

TestingClass test2 = testingCreator();
cout << "Test2: " << test2.val << endl;

TestingClass test3(test2);
cout << "Test3: " << test3.val << endl;
}

这个输出:

Test2: 100
In copy ctor
Test3: 200

最佳答案

您对 TestingClass test2 = testingCreator(); 所做的事情的想法是有缺陷的。当你看到

type name = stuff;

您不会创建name 然后为其分配stuff。您所做的是从 stuff 复制初始化 name。这意味着您调用复制或移动构造函数。通常,可以通过优化编译器来消除此调用,但如果不是,那么您将看到的就是这种情况。在任何一种情况下,都不会调用默认构造函数。

在你的第一个例子中

TestingClass test1;

强制调用默认构造函数,因为您没有默认构造函数,所以会出现错误。

关于c++ - 没有默认构造函数的初始化赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39733437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com