C ++类实例化理论

时间:2012-03-23 09:13:44

标签: c++ oop

#include <iostream>
using namespace std;

class A {
public:
    A() {
        cout << "Default Ctor" << endl;
    }
};

int main() {
    A(); // <------- Problem

    return 0;
}

它在控制台上显示默认Ctor 。我的问题

  • 有效吗?
  • 如果是这样,它是如何实例化的,因为我没有使用 new 或任何对象?

2 个答案:

答案 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仅确定 对象将在何处创建是否将创建该对象。

什么是临时无名对象?
您并不总是需要命名一个对象来实例化它们 例如:
在调用函数时,当你通过值传递对象时,临时无名对象会被创建并自动销毁。这些对象没有任何名称,因此不能通过程序明确引用但是它们可以服务它们的创建目的。

简单来说,
您正在本地/自动存储上创建一个无名临时对象,该语句在语句完成执行后不存在。