2012-03-23 3 views
2
#include <iostream> 
using namespace std; 

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

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

    return 0; 
} 

Это показывает По умолчанию CTOR на консоли. Мои вопросыC++ классовая теория конкретизации

  • Is is valid?
  • Если да, то как это создавалось, поскольку я не использовал новый или любой объект?
+0

Как вы думаете, 'A();' делает, если это не создает что-то? – Mat

+0

@Mat Да, без ** нового **, это мое сомнение – Dewsworld

ответ

7

Вы являются создание нового объекта с A().

Is is valid?

Да, это так.

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

new просто создает объект в динамической памяти. Вы создаете объект в автоматической памяти. Кроме того, только потому, что вы не дали объекту имя, это не значит, что он не создан.

Думают об этом:

int foo() { return 1; } 

int main() 
{ 
    foo(); 
} 

Оставляя в стороне оптимизаций ли foo() фактически вернуть 1? Да, это так. Просто, что вы не используете его.

EDIT:

Давайте разобьем его немного вниз:

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

Тогда почему это неверно, ** A * object = & A() ** – Dewsworld

+0

@Dewsworld допустимым синтаксисом будет 'A object = A() '. –

+1

@Dewsworld Я отредактировал свой ответ с дальнейшими объяснениями. –

3

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

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

A(); 

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

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

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

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

Что такое временные Безымянные объекты?
Вам не обязательно указывать объект для их создания.
Для Ex:
Во время вызова функции, когда вы передаете объекты по значению временно безымянный объекты создаются и уничтожаются автоматически все time.These объекты, которые не имеют никакого имени и, следовательно, не может быть явно упоминаются в рамках программы, но они служат цели, ради которой они были созданы.

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

+0

Если бы это было возможно, я бы дал вам как знак принятия! :) – Dewsworld

+0

@Dewsworld: Принять тик следует зарезервировать за ответ, который помог вам понять и решить вашу проблему наилучшим образом. Пока вы это делаете, не беспокойтесь :) –

Смежные вопросы