设计一个Bird类

#ifndef ANIMAL_H
#define ANIMAL_H

//构造函数:合成的默认构造函数、默认构造函数、default关键词、explicit关键字、
//类型转换、延迟初始化、单例模式
//析构函数:默认析构函数、虚析构函数

class Animal
{
public:
    //除非默认操作非你所需,否则请用=default来定义构造析构函数
    Animal() = default;

    Animal(const Animal&a) = delete ;
    Animal& operator=(const Animal& s) = delete;

    //除非类不可能成为基类,否则请将析构函数定义为virtual
    //构造与析构过程中,不调用virtual函数、析构函数不能抛出异常。
    //虚函数是在运行期判决的,而内联是编译期行为,所以不能从这个(内联)申明上得到任何好处;
    //将虚函数申明为内联将造成此函数在可执行文件中有多份拷贝
    virtual ~Animal();
};

#endif // ANIMAL_H

#include "Animal.h"
Animal::~Animal()
{
}

#ifndef BIRD_H
#define BIRD_H

#include "Animal.h"
#include <cstring>
#include <iostream>
class Bird: public Animal
{
public:
    //建议单参数构造函数都声明为explicit,拒绝隐式类型转换,除非你有意要隐式转换。
    Bird():m_pName(nullptr)
    {
    }

    //除非类不可能成为基类,否则请将析构函数定义为virtual
    //构造与析构过程中,不调用virtual函数、析构函数不能抛出异常。
    //虚函数是在运行期判决的,而内联是编译期行为,所以不能从这个(内联)申明上得到任何好处;
    //将虚函数申明为内联将造成此函数在可执行文件中有多份拷贝
    virtual ~Bird();
    void setName(char * pName)
    {
        if(m_pName == nullptr)
        {
            m_pName = new char[strlen(pName) + 1];
            strcpy(m_pName, pName);
        }
        else
        {
            delete []m_pName;
            m_pName = new char[strlen(pName) + 1];
            strcpy(m_pName, pName);
        }
    }
    char *getName()
    {
        return m_pName;
    }
    //拷贝构造函数:深拷贝/浅拷贝、禁止拷贝
    Bird(const Bird& bird)
    {
        m_pName = new char[strlen(bird.m_pName) + 1];
        strcpy(m_pName, bird.m_pName);
    }
// 赋值构造函数:深拷贝/浅拷贝、禁止拷贝
//    考虑可能会 由于内存空间不足 申请内存失败
//    Bird& operator=(const Bird& bird)
//    {
//        //自己给自己赋值的情况
//        if(this == &bird)
//            return *this;
//
//        delete [] m_pName;
//        m_pName = nullptr;
//
//        m_pName = new char[strlen(bird.m_pName) + 1];
//        strcpy(m_pName, bird.m_pName);
//        return *this;
//    }

        Bird& operator = (const Bird& bird)
        {
            if(this != &bird)
            {
                //先调用拷贝构造函数创建一个临时实例
                Bird birdTemp(bird);
                //将 临时实例 和 实例 自身交换
                char* pTemp = birdTemp.m_pName;
                birdTemp.m_pName = m_pName;
                m_pName = pTemp;
            }
            //运行到此处birdTemp超出作用域 自动析构了,birdTemp.m_pName 指向原来实例 所申请的内存
            return *this;
        }
private:
    char *m_pName;
};

#endif // BIRD_H

#include "Bird.h"

Bird::~Bird()
{
    delete []m_pName;
}

#include <Bird.h>

#define ARRAY_LENGTH 16
using namespace std;

int main()
{
    Bird *bird = new Bird();
    char a[] = "birdName";
    bird->setName(a);

    Bird myBird(*bird);
    char arrayMyBird[ARRAY_LENGTH];
    strcpy(arrayMyBird, myBird.getName());

    cout << arrayMyBird <<endl;
    delete bird;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值