等号重载操作符

如果你想对一个类进行赋值拷贝操作的话 需要写一个等号重载操作符 如果你不写的话 他也会有一个默认的 

这个默认的等号重载操作符的功能与默认的拷贝构造函数是一样的 就是 单纯的将两个内存进行拷贝复制

但是如果你类中有一个指针型的成员变量需要额外开辟空间的话 我们就需要重写一个等号重载操作符 

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
using namespace std;

class Student
{
public:
	//无参构造
	Student() {
		this->id = 0;
		this->name = NULL;
	}
	//有参构造
	Student(int id,char *name) {
		this->id = id;
		//如果传递常量 可以直接赋值 this->name = name;
		//传递指针这里需要将副本额外拷贝空间
		int len = strlen(name);
		this->name = new char[len+1];
		strcpy(this->name,name);
	}
	//可以连等 返回值引用
	Student & operator=(const Student &another) {
		//防止自身赋值
		if (this == &another) { return *this; }
		//释放自身垃圾
		if (this->name!=NULL) {
			delete[] this->name;
			this->name = NULL;
		}
		// 执行深拷贝
		this->id = another.id;
		int len = strlen(another.name);
		this->name = new char[len + 1];
		strcpy(this->name,another.name);
		return *this;

	}
	void printname() {
		cout << this->name << endl;
	}
	//深拷贝
	Student(const Student &another) {
		this->id = another.id;
		int len = strlen(another.name);
		this->name =  new char[len + 1];
		strcpy(this->name, another.name);
	}
	~Student() {
		if (this->name != NULL) {
			//释放空间
			delete[] this->name;
			this->name = NULL;
			this->id = 0;
		}
	}
private:
	int id;
	char *name;
};
void main() {
	Student s1(1,"zhangsan");
	Student s2 = s1; //拷贝构造
	s1.printname();
	Student s3(2,"li4");
	s2 = s3; //这里会调用s2的等号赋值操作符
	s2.printname();
	system("pause");
}

QQ截图20181214144929.png

本博客所有文章如无特别注明均为原创。作者:odaycaogen复制或转载请以超链接形式注明转自 123``blog
原文地址《等号重载操作符

相关推荐

发表评论

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

网友评论(0)