C++之運算符重載(三)

這是運算符重載的第三篇文章,上篇地址:

https://blog.csdn.net/zy010101/article/details/105245007

本篇講述重載等號運算符。直接上代碼。

//Human.h
#pragma once


#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

class Human
{
private:
	int age;
	int height;
	char* name;
public:
	Human(int age, int height,const char* name);
	Human(const Human& man);
	~Human();
	Human& operator=(Human& man);		//重載等號運算符
	//重載輸出運算符
	friend std::ostream& operator<<(std::ostream& out, const Human& man)
	{
		out << "age:" << man.age << "   height:" << man.height << "   name:" << man.name << std::endl;
		return out;
	}
};

//Human.cpp

#include "Human.h"

Human::Human(int age, int height, const char* name)
{
	this->age = age;
	this->height = height;
	this->name = (char*)malloc(strlen(name) + 1);
	strcpy(this->name, name);
}

Human::Human(const Human& man)
{
	this->age = man.age;
	this->height = man.height;
	this->name = (char*)malloc(strlen(man.name) + 1);
	strcpy(this->name, man.name);
}

Human& Human::operator=(Human& man)
{
	this->age = man.age;
	this->height = man.height;
	if (NULL != this->name)
	{
		free(this->name);
	}
	this->name = (char*)malloc(strlen(man.name) + 1);
	strcpy(this->name, man.name);
	return *this;
}


Human::~Human()
{
	if (NULL != this->name)
	{
		free(this->name);
		this->name = NULL;
	}
}
//main.cpp

#include"Human.h"

int main()
{
	Human man1(3, 50, "Peter");
	std::cout << man1;

	Human man2(33, 182, "LaoWang");
	std::cout << man2;

	man2 = man1;
	std::cout << man2;

	return 0;
}

輸出結果如下:

代碼中拷貝構造函數的實現和重載等號操作符幾乎是一致的,其實這也是因爲如果你不重載等號運算符,C++會提供一個默認的等號運算符重載。但是這個運算符重載也是淺拷貝。遇到指針就會出錯,這時候就需要我們手動重載等號運算符。這也是爲什麼不能把它重載爲友元函數的原因,因爲類內默認提供一個重載等號運算符。你如果重載在類外,那麼將會造成調用不明確。

剩下的+=, -+, *=, /=,%=, <<=, >>= , ^=,&=, |=這些運算符可以重載爲成員函數,也可以重載爲友元函數。

=, [ ],  ( ), ->必須是重載爲成員。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章