类的深拷贝和浅拷贝

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中已经创建的对象来初始化新创建的对象。拷贝构造函数通常用于:

  • 通过使用另一个同类型的对象来初始化新创建的对象。

  • 复制对象把它作为参数传递给函数。

  • 复制对象,并从函数返回这个对象。

如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的原型:

void Teacher(const Teacher &anthor){

     // 构造函数的主体 类成员赋值

     m_id = anthor.m_id;

     m_mame = ahthor.m_name;

}

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Teacher{
	public:
		//有参构造函数
		//通过一个id和字符串触发自己
		Teacher(int id,char *name){
			m_id = id; //赋值ID
			//赋值name
			int len = strlen(name);
			m_name = (char *) malloc(len+1);
			strcpy(m_name,name);
			
			cout << id << "-" << name << endl;
		}
		void printF(){
			cout << "mid:" << m_id << "m_name:" << m_name << endl;
		}
		//拷贝构造函数 默认自带的 
		Teacher(const Teacher &anthor){
			 m_id = anthor.m_id;
			 m_mame = ahthor.m_name;
		}
		~Teacher(){
			if(m_name!=NULL){
				free(m_name);
			}
			cout << "调用析构函数" << endl; 
		}
	private:
		int m_id;
		//char name[50]; //这样会在堆上直接开辟空间
		char *m_name;
};

void test(){
	
	Teacher t1(20,"fuck86.com"); //实例化Teacher类t1
	t1.printF();
	
	Teacher t2(t1); //触发t2的默认拷贝函数
	t2.printF();
}
void main(){
	
	// Teacher t1(20,"fuck86.com"); //实例化Teacher类t1
	// t1.printF();
	
	// Teacher t2(t1); //触发t2的默认拷贝函数
	// t2.printF();
	
	test(); //执行程序就崩了 这是一个浅拷贝
	system("pause");
}

 

QQ截图20181211160051.png

 

只要类成员遇到一个指针 就需要提供一个拷贝函数 完成 深拷贝动作 我们的修改方案就是手动 默认的拷贝函数仅仅将值拷贝 称谓浅拷贝

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Teacher{
	public:
		//有参构造函数
		//通过一个id和字符串触发自己
		Teacher(int id,char *name){
			m_id = id; //赋值ID
			//赋值name
			int len = strlen(name);
			m_name = (char *) malloc(len+1);
			strcpy(m_name,name);
			
			cout << id << "-" << name << endl;
		}
		void printF(){
			cout << "mid:" << m_id << "m_name:" << m_name << endl;
		}
		//拷贝构造函数 默认自带的 
		// Teacher(const Teacher &anthor){
			 // m_id = anthor.m_id;
			 // m_mame = ahthor.m_name; 
		// }
		Teacher(const Teacher &anthor){
			 m_id = anthor.m_id;
			 //m_mame = ahthor.m_name; 
			 int len = strlen(anthor.m_name);
			 m_name = (char *)malloc(len + 1); //提供一个拷贝构造完成深拷贝动作
			 strcpy(m_name,anthor.m_name);
		}
		~Teacher(){
			if(m_name!=NULL){
				free(m_name);
			}
			cout << "调用析构函数" << endl; 
		}
	private:
		int m_id;
		//char name[50]; //这样会在堆上直接开辟空间
		char *m_name;
};

void test(){
	
	Teacher t1(20,"fuck86.com"); //实例化Teacher类t1
	t1.printF();
	
	Teacher t2(t1); //触发t2的默认拷贝函数
	t2.printF();
}
void main(){
	
	// Teacher t1(20,"fuck86.com"); //实例化Teacher类t1
	// t1.printF();
	
	// Teacher t2(t1); //触发t2的默认拷贝函数
	// t2.printF();
	
	test(); //执行程序就崩了 这是一个浅拷贝
	system("pause");
}

 

本博客所有文章如无特别注明均为原创。作者:odaycaogen复制或转载请以超链接形式注明转自 123``blog
原文地址《类的深拷贝和浅拷贝

相关推荐

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)