Теория реализации класса C ++ - PullRequest
2 голосов
/ 23 марта 2012
#include <iostream>
using namespace std;

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

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

    return 0;
}

Показывает Ctor по умолчанию на консоли.Мои вопросы

  • Действителен ли?
  • Если да, то как он был создан, поскольку я не использовал new или какой-либо объект?

Ответы [ 2 ]

7 голосов
/ 23 марта 2012

Вы создаете новый объект с 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
3 голосов
/ 23 марта 2012

Это действительно?
Да, это действительно

Что именно происходит?

A(); 

Создает временное безымянное имяобъект типа A, вызывая его конструктор по умолчанию без аргумента, но объект разрушается к тому времени, когда следующий оператор выполняется с тех пор.

Если так, то как он был создан, так как я этого не делалиспользовать новый или какой-либо объект?
Вы можете создавать объекты в локальном / автоматическом хранилище или в динамическом хранилище в зависимости от вашего использования.

Когда вы используете new объекты создаются в динамическом хранилище (куче), когда вы создаете объект, который у вас есть, он создается в локальном / автоматическом хранилище (стеке).

Таким образом, использование new определяет только , где объект будет создан, а не , будет ли он создан.

Что такое временные безымянные объекты?
Вам не всегда нужно присваивать имена объектам, чтобы создавать их экземпляры.
Например:
При вызове функции при передачеобъекты со значением временные безымянные объекты создаются и автоматически уничтожаются все время. Это объекты, которые не имеют никакого имени и, следовательно, не могут быть явно указаны в программе, но они служат цели, для которой они были созданы.

Проще говоря,
Вы создаете безымянный временный объект в локальном / автоматическом хранилище, которого не существует после завершения выполнения оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...