C ++完全是新手

时间:2015-09-21 09:20:51

标签: c++

#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;
}

我得到了输出:

Animal created                                                         
My name is: Bertia
Animal destroyed

这里调用的“Animal created”构造函数是针对哪个对象a或a_以及析构函数。它是用于在我们定义Animal a或何时定义的 我们为a_调用createAnimal()同样适用于析构函数,何时在a_的main函数结束后或者在createAnimal()函数结束后调用?

2 个答案:

答案 0 :(得分:3)

  

现在我的问题是&#34; Animal created&#34;构造函数是针对哪个对象a或a_以及析构函数是针对哪个对象a或a_?

两者。这里不需要两个对象。

  

还请解释如何创建对象的过程以及复制构造函数的机制,即如何调用和销毁对象。

该对象在createAnimal中创建并返回main,其中a_变为relativeLayoutSign.removeView(); relativeLayoutSign.addView(signatureView); 。不需要复制构造,因为可以通过延长临时的寿命来省略它。

C ++标准特别允许此优化,这是允许更改正确代码行为的极少数情况之一。

答案 1 :(得分:0)

你可以添加更多的couts来查找。例如。像这样的东西:

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;

}