我是新来的C++。 我见过一些类的例子。 我很难理解何时创建对象时不得不调用构造函数(whith()),以及何时不必使用consructor创建对象。C++用构造函数或wothout创建一个对象?
回答
构造函数创建(类型)C++对象时总是调用。你不能改变这一点。
假设你有一个默认的构造函数(即接受()
之间没有参数),那么这将作为
YourClass x;
它实际上是一个非常糟糕的主意,因为简单的东西使用()
创建调用对象在这种情况下,由于
YourClass thing();
编译器将此解释为一个名为thing()
函数,它不接受任何参数的声明,并返回YourClass
类型的值。如果像普通对象实例一样使用thing
,那么这通常会导致编译错误。
正如我最近学到的,这不是Scott Meyers所称的最令人头疼的解析。 – StoryTeller
梅耶斯称为最令人头疼的解析是在模板的上下文中。但是,即使在模板之外也会发生同样的问题。无论如何,我将删除对令人头痛的解析的引用,因为术语辩论不会为OP增加任何内容。 – Peter
@ Peter-那应该得到params的consructor呢? – Sarti
构造函数在创建对象时总是被调用,它可以隐式调用。
class SomeClass
{
SomeClass() {}
};
SomeClass myObject; // in fact it a: SomeClass myObject = SomeClass();
如果'SomeClass'没有可访问的拷贝构造函数,你会发现'SomeClass myObject = SomeClass()'将无法编译。在这种情况下,“SomeClass myObject”不会失败。 – Peter
如果创建了一个对象,它的一个构造函数总是被调用。
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);
第二种情况'Foo x()'不会创建'Foo'。这是最令人头痛的解析的一个例子。 – Peter
@彼得正确。 –
如果您创建一个对象,你总是调用构造函数。无论是使用圆括号还是(使用新标准),都可以使用大括号。如果你想调用没有参数的构造函数,你可以全部省略括号,但是你仍然可以调用一个构造函数。
不调用构造函数的唯一可能性是如果使用指针,因为指针只保存对象的内存地址。要实际创建一个对象,您需要使用new
(再次调用构造函数),但如果已经有一个要指向的对象,则可以稍后完成或跳过。
对于内建类型,您还可以跳过“构造函数”,这会导致单位变量。
如果调用构造函数是一个你自己定义的,或者如果它是隐式由编译器定义的是,虽然另一个问题...
当您“仅分配内存”并尝试将其分配给对象指针时,您会收到错误消息。这一段对于外行人来说只是令人困惑。 – StoryTeller
这样更清楚吗? – Anedar
不是。在这种情况下,关于如何绕过语言保证的不变性,以及大部分手挥手的段落,并不具有建设性。 – StoryTeller
- 1. C++对象创建和构造函数
- 2. 在构造函数或类的顶部创建一个对象
- 3. 使用反射创建一个对象:Activator.CreateInstance或Inovking的构造函数C#
- 4. 在构造函数中创建一个对象的指针C++
- 5. 有一个默认的构造函数创建一个对象
- 6. 构造函数创建const对象
- 7. 在构造函数中创建对象
- 8. 从构造函数创建对象
- 9. 使用参数化构造函数创建类的对象c#
- 10. 未由构造函数调用paintcomponent或创建对象时
- 11. C#创建对象比构造函数调用慢得多
- 12. 没有构造函数调用的C++对象创建
- 13. C++的构造函数调用和对象创建
- 14. 用c中的私有构造函数创建一个私有对象#
- 15. 在类的构造函数中创建另一个对象
- 16. 如果构造函数在另一个函数内,新创建的对象调用构造函数undefined
- 17. 复制构造函数调用默认构造函数以创建对象
- 18. C#:如何创建一个DateTime作为参数的构造函数?以及如何用这个构造函数创建一个对象?
- 19. 按需或在构造函数中创建属性对象?
- 20. 如何创建一个构造函数在javascript中创建构造函数?
- 21. 构建其他对象构造函数的对象构造函数
- 22. 为什么私人构造函数阻止对象创建C++
- 23. C++ - 类构造函数创建对象,但构造的结果是不同的
- 24. 构造一个通用对象(不是默认构造函数)
- 25. 在构造函数中从已保存的对象中创建一个对象
- 26. 创建一个类的构造函数
- 27. SFML C++创建多个对象并在构造函数中调用?
- 28. 对象构造函数的C++数组
- 29. C++创建2参数构造函数
- 30. 通行证现有对象构造函数或构建一个新的
对象总是由构造函数创建 –
显示有关使用或不使用构造函数创建对象的一些代码。 – songyuanyao
使用圆括号只是使“调用”更加明确,但总是调用构造函数。 –