C++创建类实例的语法

3

我一直在研究如何在C++中创建类的实例。似乎有几种方法可以做到这一点:

ClassExample classExample1;
ClassExample classExample2();
ClassExample classExample3(void);
ClassExample classExample4 = ClassExample();

1和4调用默认构造函数。当我使用2和3时,似乎无法引用变量并且它们未初始化。在调试器中,它们被跳过。为什么会这样?它们是相同的吗?有什么区别?是否有首选选项?

当我们有要传递的参数时,有两种方法可以做到这一点:

ClassExample classExample1(true, 1, "");
ClassExample classExample2 = ClassExample(true, 1, "");

再次确认,有什么区别吗?哪个是首选选项?

更新

C++ 11还引入了这种形式的初始化:

ClassExample classExample2{ };

这相当于:

ClassExample classExample2();

可能是重复的问题:创建类的实例 - dandan78
4
http://en.wikipedia.org/wiki/Most_vexing_parse - Neil Kirk
1
我刚刚提出的相关问题:http://stackoverflow.com/questions/24510052/which-constructor-is-called-in-the-following-code - Neil Kirk
@dandan78 - 我看了那个链接。这一个有一些不同的。 - Muhammad Rehan Saeed
2个回答

8

没有关于首选选项的问题

ClassExample classExample2();

ClassExample classExample3(void);

声明了一个返回ClassExample对象的函数


哇,这里犯错真的太容易了!! - Muhammad Rehan Saeed

3

选项1是首选 - 它直接初始化变量。

选项2和3声明函数,而不是变量,这就是为什么你没有观察到变量的原因。

选项4与选项1大致等效,但它过于冗长,概念上更加复杂,并且对类型施加了额外的要求。原则上,它创建一个临时对象,通过复制或移动来初始化变量,然后销毁临时对象。实际上,这通常会被省略,产生与第一个选项相同的结果;但如果该类型没有可访问的复制或移动构造函数,则无法编译。


2
这是否保证了优化?请看这里:http://stackoverflow.com/questions/24510052/which-constructor-is-called-in-the-following-code - Neil Kirk
1
@NeilKirk:不,这并不是保证的。可能有一些编译器不会花时间来进行优化,但你不会为任何实际目的使用它们。 - Mike Seymour
1
这篇文章说标准规定“_T = x;_”等同于“_T(x);_”。(§12.8.15, pg. 211) - P0W
2
@P0W:我认为这些应该是声明,意思是T y = x;等同于T y(x);。我不明白这与问题有什么关系;它并没有增加另一个选项,因为ClassExample e5(ClassExample());也是一个函数声明,即使它确实增加了一个选项,你仍然会使用选项1而不是搞弄临时变量。 - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接