【问题标题】:C++ Syntax For Creating Instances Of A Class用于创建类实例的 C++ 语法
【发布时间】:2014-08-21 23:41:20
【问题描述】:

我一直在研究如何在 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();

【问题讨论】:

标签: c++ class c++11 instance


【解决方案1】:

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

2 和 3 声明的是函数,而不是变量,这就是你不观察变量的原因。

4 (或多或少)等同于 1,但它不必要地冗长,概念上更复杂,并且对类型施加了额外的要求。原则上,它创建一个临时对象,通过复制或移动变量来初始化变量,然后销毁临时对象。在实践中,这将(通常)被省略,给出与第一个选项相同的结果;但除非该类型具有可访问的副本或移动构造函数,否则它不会编译。

【讨论】:

  • 是否保证优化?看这里:stackoverflow.com/questions/24510052/…
  • @NeilKirk:不,不能保证。可能有些编译器不关心优化,但您不会将它们用于任何实际目的。
  • This 说标准说 T = x;相当于说 T(x);。 (§12.8.15,第 211 页)
  • @P0W:我认为那些应该是声明,这意味着T y = x; 等同于T y(x);。我不明白这与这个问题有什么关系;它不会添加另一个选项,因为 ClassExample e5(ClassExample()); 也是一个函数声明,即使添加了,您仍然会使用选项 1 而不是乱用临时变量。
【解决方案2】:

首选选项没有问题

ClassExample classExample2();

ClassExample classExample3(void);

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

【讨论】:

  • 哇,这里容易出错!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多