[英]C++ class instantiation theory
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "Default Ctor" << endl;
}
};
int main() {
A(); // <------- Problem
return 0;
}
它在控制台上显示Default Ctor 。 我的问题
您正在使用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
有效吗?
是的,这是有效的
究竟发生了什么?
A();
通过调用其默认的无参数构造函数来创建类型A
的临时无名对象,但该对象在下一个语句执行后被破坏。
如果是这样,它是如何实例化的,因为我没有使用新的或任何对象?
您可以根据用途在本地/自动存储或动态存储上创建对象。
在动态存储(堆)上创建使用new
对象时,在创建对象时,会在本地/自动存储(堆栈)上创建对象。
因此,使用new
仅确定创建对象的位置 ,而不是是否将创建对象。
什么是临时无名对象?
您并不总是需要命名对象来实例化它们。
对于Ex:
在调用函数时,当您按值传递对象时, 临时无名对象会被创建并自动销毁。这些对象没有任何名称,因此不能通过程序显式引用,但它们的确有助于创建它们的目的。
简单来说,
您正在本地/自动存储上创建无名临时对象,该语句在语句完成执行后不存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.