2016-02-29 112 views
-4

我是新来的C++。 我见过一些类的例子。 我很难理解何时创建对象时不得不调用构造函数(whith()),以及何时不必使用consructor创建对象。C++用构造函数或wothout创建一个对象?

+0

对象总是由构造函数创建 –

+0

显示有关使用或不使用构造函数创建对象的一些代码。 – songyuanyao

+1

使用圆括号只是使“调用”更加明确,但总是调用构造函数。 –

回答

2

构造函数创建(类型)C++对象时总是调用。你不能改变这一点。

假设你有一个默认的构造函数(即接受()之间没有参数),那么这将作为

YourClass x; 

它实际上是一个非常糟糕的主意,因为简单的东西使用()创建调用对象在这种情况下,由于

YourClass thing(); 

编译器将此解释为一个名为thing()函数,它不接受任何参数的声明,并返回YourClass类型的值。如果像普通对象实例一样使用thing,那么这通常会导致编译错误。

+0

正如我最近学到的,这不是Scott Meyers所称的最令人头疼的解析。 – StoryTeller

+1

梅耶斯称为最令人头疼的解析是在模板的上下文中。但是,即使在模板之外也会发生同样的问题。无论如何,我将删除对令人头痛的解析的引用,因为术语辩论不会为OP增加任何内容。 – Peter

+0

@ Peter-那应该得到params的consructor呢? – Sarti

0

构造函数在创建对象时总是被调用,它可以隐式调用。

class SomeClass 
{ 
    SomeClass() {} 
}; 

SomeClass myObject; // in fact it a: SomeClass myObject = SomeClass(); 
+2

如果'SomeClass'没有可访问的拷贝构造函数,你会发现'SomeClass myObject = SomeClass()'将无法编译。在这种情况下,“SomeClass myObject”不会失败。 – Peter

1

如果创建了一个对象,它的一个构造函数总是被调用。

Foo x; 
Foo x{}; 

所有上述表述会做同样的,创建一个使用默认构造函数一个Foo对象。请注意0​​在这种情况下无效,请参阅Peter的答案以解释原因。

如果你有传递参数给构造函数,或者如果你有使用,你总是必须使用括号:

Foo y(42, true); 
Foo y{21, false}; 
Foo* y = new Foo(); 
Foo* y = new Foo(2, false); 
+1

第二种情况'Foo x()'不会创建'Foo'。这是最令人头痛的解析的一个例子。 – Peter

+0

@彼得正确。 –

0

如果您创建一个对象,你总是调用构造函数。无论是使用圆括号还是(使用新标准),都可以使用大括号。如果你想调用没有参数的构造函数,你可以全部省略括号,但是你仍然可以调用一个构造函数。

不调用构造函数的唯一可能性是如果使用指针,因为指针只保存对象的内存地址。要实际创建一个对象,您需要使用new(再次调用构造函数),但如果已经有一个要指向的对象,则可以稍后完成或跳过。
对于内建类型,您还可以跳过“构造函数”,这会导致单位变量。

如果调用构造函数是一个你自己定义的,或者如果它是隐式由编译器定义的是,虽然另一个问题...

+0

当您“仅分配内存”并尝试将其分配给对象指针时,您会收到错误消息。这一段对于外行人来说只是令人困惑。 – StoryTeller

+0

这样更清楚吗? – Anedar

+0

不是。在这种情况下,关于如何绕过语言保证的不变性,以及大部分手挥手的段落,并不具有建设性。 – StoryTeller

相关问题