gpt4 book ai didi

c++ - C++ 构造函数语法的详细信息

转载 作者:太空狗 更新时间:2023-10-29 19:49:37 25 4
gpt4 key购买 nike

这几乎是一个重复的问题,但我真的不明白另一个问题的答案,所以我要再试一次:

我正在学习 C++,并且试图了解用于创建和使用构造函数的各种选项。所以我的第一个问题是这两个对象创建之间的区别是什么:

 class Example{
Example(int x){myX = x} ;
private:
int myX;
}

然后在我的主要方法中:

 Example example1 = new Example(5);
Example example2 = Example(5);
Example example3(5);

我知道使用 new 会给我一个动态分配的对象,稍后我需要删除它。并且 example2 将分配在堆栈上,不需要删除。但是我真的不明白什么时候或者为什么要使用 example3 的构造函数样式。任何涉及最少行话的帮助将不胜感激,因为这就是为什么我在其他地方似乎无法理解这一点。非常感谢你们能为我提供任何帮助。

最佳答案

两个声明

Example example2 = Example(5);
Example example3(5);

是等价的。尽管第一个看起来可能会创建一个对象,然后调用复制构造函数,但大多数编译器只会在适当的位置创建example2 对象。

关于何时选择使用上述哪种样式的决定在很大程度上取决于品味。

这里有一个完整的示例程序来演示:

#include <iostream>

using namespace std;

class Test {
public:
Test(int x): X(x) {
cout << "constructor " << X << endl;
}
Test(const Test &rhs): X(rhs.X) {
cout << "copy " << X << endl;
}
Test &operator=(const Test &rhs) {
X = rhs.X;
cout << "assign " << X << endl;
return *this;
}
private:
int X;
};

int main()
{
Test t1 = Test(1);
Test t2(2);
t2 = t1;
}

和输出(gcc 4.2.1,OS X Lion):

constructor 1
constructor 2
assign 1

注意赋值运算符是如何只为 t2 = t1 调用的(如预期的那样),但根本没有调用复制构造函数。 (但是,正如 Dennis Zickefoose 在评论中指出的那样,复制构造函数必须可访问。尝试在上面的示例中将复制构造函数设置为private,编译器应该拒绝编译它。)

编辑:请注意 gcc 实际上有一个控制此行为的选项:

    -fno-elide-constructors        The C++ standard allows an implementation to omit creating a        temporary which is only used to initialize another object of the        same type.  Specifying this option disables that optimization, and        forces G++ to call the copy constructor in all cases.

关于c++ - C++ 构造函数语法的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7782343/

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