2015-09-21 1 views
-6
#include<iostream> 
using namespace std; 

class Animal 
{ 
    private: 
     string name; 
    public: 
     Animal() 
     { 
      cout << "Animal created" << endl; 
     } 

     Animal(const Animal& other): 
      name(other.name){ 
       cout << "Animal created by copying" << endl; 
     } 

     ~Animal() 
     { 
      cout << "Animal destroyed" << endl; 
     } 

     void setName(string name) 
     { 
      this->name = name; 
     } 
     void speak()const{ 
      cout << "My name is: " << name << endl; 
    } 
}; 

Animal createAnimal() 
{ 
    Animal a; 
    a.setName("Bertia"); 
    return a; 
} 


int main() 
{ 

    Animal a_= createAnimal(); 
    a_.speak(); 

    return 0; 
} 

Я получил выход:C++ dought полностью Начинающие

Animal created               
My name is: Bertia 
Animal destroyed 

«звериного созданный» конструктор называется здесь, для которого объект а или а_, а также для деструктора. Является ли это для вызываемого, где мы определяем Animal a или когда мы вызываем createAnimal() для a_ И то же самое относится к деструктору, когда он вызывается после окончания основной функции для a_ или после конца функции createAnimal() для a?

+2

Мы здесь не для публикации контента для начинающих книги в ответах, которые вышли бы слишком широким. Пожалуйста, просмотрите [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) из FAQ и выберите его. –

ответ

3

Теперь мой вопрос: «Конструктор, созданный животными» для объекта, для которого объект a или a_, а также деструктор для какого объекта a или a_?

Оба. Здесь нет необходимости в двух объектах.

А также объясните, как создается объект здесь, а также механизм конструктора копирования, например, как вызывается и уничтожается объект.

Объект создан в createAnimal и вернулся в main, где он становится a_. Конструкция копирования не требуется, поскольку ее можно устранить, продлевая срок службы временного.

Стандарт C++ специально разрешает эту оптимизацию, один из редких случаев, когда разрешена оптимизация, изменяющая поведение правильного кода.

0

Вы можете добавить еще несколько цитат, чтобы узнать это. Например. что-то вроде этого:

Animal createAnimal() 
{ 
    std::cout << " creation of a " << std::endl; 
    Animal a; 
    a.setName("Bertia"); 
    std::cout << " returning from createAnimal " << std::endl; 
    return a;   
} 


int main() 
{ 
    std::cout << " calling createAnimal() " << std::endl; 
    Animal a_= createAnimal(); 
    std::cout << " calling a_.speak() " << std::endl; 
    a_.speak(); 
    std::cout << " returning from main " << std::endl; 
    return 0; 

}

+0

Okk я сделал и получил выход :: «» «» «» вызов createAnimal() создания животных создана возвращения из createAnimal призывающей a_.speak() Меня зовут: Bertia возвращение из основных животных уничтожен "" "" "" "" "" "" Таким образом, это означает, что созданный animak вывод предназначен для объекта 'a', поэтому почему мы не получили деконструктор, как только мы вернемся из createAnimal()? почему это после main, когда ' a_ 'уничтожается –

+0

@ShivamChauhan хорошо, и теперь у вас (надеюсь) есть шанс понять Дэвида Шварца, потому что то, что вы наблюдаете, это то, что он описывает – user463035818

+0

@ShivamChauhan, вы отредактировали комментарий, пока я печатал ... Извините, но я не объясню вам почему a_ разрушается в конце main. Если бы я это сделал, я бы просто помешал вам прочитать об этом в книге (и, очевидно, вы должны это сделать) – user463035818

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