第九章 C++编程之拷贝构造

第九章 C++编程之拷贝构造

9.1 拷贝构造

创建类的过程中会自动创建的几种函数,包括:构造函数、析构函数、拷贝构造。

9.2 示例代码

1、定义类的头文件animal.h

#include <iostream>
using namespace std;
class Animal{
private:
	char*name;
	int age;
public:
	Animal(){
		name = NULL;
		cout << "this is empty animal" << endl;}
	Animal(char *name,int age);//构造函数
	Animal(Animal&alife);//拷贝构造函数
	~Animal();
	void setName(char *name);
	void setAge(int age);
	void printInfo();
};

2、类的实现函数animal.pp

#include "animal.h"
#include <string.h>
#include <unistd.h>
void Animal::setName(char *name)
{
	if(this->name){
		delete this->name;
	}
	this->name = new char[strlen(name) + 1];
	strcpy(this->name, name);
}
void Animal::setAge(int age)
{
	this->age = age;
}
void Animal::printInfo()
{
	cout << "this is " << this->name << ",age = " << this->age << endl;
}
Animal::Animal(char *name,int age)
{
	cout << "Animal(char *name,int age)" << endl;
	this->name = new char[strlen(name) + 1];
	strcpy(this->name, name);
	this->age = age;
}

//拷贝构造函数
Animal::Animal(Animal &alife)
{
	this->name = new char[strlen(alife.name)+1];
	strcpy(this->name,alife.name);
	this->age = alife.age;
}

//析构函数
Animal::~Animal()
{
	cout << "~Animal()" << endl;
	if(this->name != NULL){
		cout << "name is " << this->name << endl;
		delete this->name;
	}
}

3、主函数main.c

#include "animal.h"
#include <string.h>
#include <unistd.h>
int main(int argc ,char**argv)
{
	Animal egg("egg",0);
	egg.printInfo();
	cout << "----------" << endl;
	Animal duck(egg);//拷贝构造

	duck.printInfo();
}

4、Makefile文件

#生成可执行文件person,依赖于文件 main.c和person.c
# 符号的意义: $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件
main:main.o animal.o
	g++ -o $@ $^
%.o : %.cpp
	g++ -c -o $@ $<
clean:
	rm -rf *.o main

注意:
使用指针在申请和释放空间时,重复释放极易导致段错误!

9.3 注意析构函数的实现

注意指针和空间释放的问题,重复释放会导致段错误,没有释放容易导致内存溢出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值