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