#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "Default Ctor" << endl;
}
};
int main() {
A(); // <------- Problem
return 0;
}
它在控制台上显示默认Ctor 。我的问题
答案 0 :(得分:7)
您 使用A()
创建新对象。
有效吗?
是的。
如果是这样,它是如何实例化的,因为我没有使用新的或任何对象?
new
只是在动态内存中创建对象。您正在自动内存中创建对象。另外,仅仅因为你没有给对象命名,并不意味着它没有被创建。
想一想:
int foo() { return 1; }
int main()
{
foo();
}
抛开优化 foo()
实际上是否已归还1
?是的,它确实。只是你没有使用它。
修改强>
让我们分解一下:
A(); //creates a temporary unnamed object in automatic storage
A a; //creates an object a of type A in automatic storage
A a(); //creates no object, but declare a function a returning A and taking no parameters
A a(A()); //these two are equivalent
A a = A(); //creates a temporary unnamed object and creates an object a in automatic storage
//using the compiler-generated copy constructor
A a;
a = A(); //creates an object a in automatic storage
//creates an unnamed temporary object and uses the compiler-generated assignment operator
//to assign it to a
A a = &A(); //invalid, &A() is the address of a temporary a, which is illegal
答案 1 :(得分:3)
是否有效?
是的,这是有效的
到底发生了什么?
A();
通过调用默认的无参数构造函数来创建类型为A
的临时无名对象,但该对象在执行下一个语句时被破坏。
如果是这样,它是如何实例化的,因为我没有使用新的或任何对象?
您可以根据用途在本地/自动存储或动态存储上创建对象。
在动态存储(堆)上创建使用new
对象时,在创建对象时,会在本地/自动存储(堆栈)上创建对象。
因此,使用new
仅确定 对象将在何处创建是否将创建该对象。
什么是临时无名对象?
您并不总是需要命名一个对象来实例化它们
例如:
在调用函数时,当你通过值传递对象时,临时无名对象会被创建并自动销毁。这些对象没有任何名称,因此不能通过程序明确引用但是它们可以服务它们的创建目的。
简单来说,
您正在本地/自动存储上创建一个无名临时对象,该语句在语句完成执行后不存在。