C++学习笔记之运算符重载(赋值运算符,关系运算符重载)C++运算符重载 运算符重载 重载运算符

C++学习笔记之运算符重载(赋值运算符,关系运算符重载)C++运算符重载 运算符重载 重载运算符
赋值运算符重载
C++编译器至少要给一个类添加4个函数

  • 默认构造函数
  • 默认析构函数
  • 默认拷贝构造函数
  • 赋值运算符 operator=对属性进行值拷贝
    如果类中有属性指向堆区,做赋值操作的时候会出现深浅拷贝的问题
    应该要先判断是否有属性在堆区,如果要先释放干净,然后再进行深拷贝

if(m_Age != NULL){
delete m_Age;
m_Age = NULL;
}

#include <iostream>
using namespace std;

//C++编译器至少给一个类添加4个函数
//1.默认构造函数(无参,函数体为空)
//2.默认析构函数(无参,函数体为空)
//3.默认拷贝构造函数,对属性进行值拷贝
//4.赋值运算符operator=, 对属性进行值拷贝

//如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题

class Person
{
public:

	Person(int age)
	{
		//将年龄数据开辟到堆区
		m_Age = new int(age);
	}

	//重载赋值运算符 
	Person& operator=(Person& p)
	{
		if (m_Age != NULL)
		{
			delete m_Age;
			m_Age = NULL;
		}
		//编译器提供的代码是浅拷贝
		//m_Age = p.m_Age;

		//提供深拷贝 解决浅拷贝的问题
		m_Age = new int(*p.m_Age);

		//返回自身
		return *this;
	}

	~Person()
	{
		if (m_Age != NULL)
		{
			delete m_Age;
			m_Age = NULL;
		}
	}

	//年龄的指针
	int* m_Age;

};


void test01()
{
	Person p1(18);

	Person p2(20);

	Person p3(30);

	p3 = p2 = p1; //赋值操作

	cout << "p1的年龄为:" << *p1.m_Age << endl;

	cout << "p2的年龄为:" << *p2.m_Age << endl;

	cout << "p3的年龄为:" << *p3.m_Age << endl;
}

int main() {

	test01();

	//int a = 10;
	//int b = 20;
	//int c = 30;

	//c = b = a;
	//cout << "a = " << a << endl;
	//cout << "b = " << b << endl;
	//cout << "c = " << c << endl;

	system("pause");

	return 0;
}

关系运算符重载
作用: 重载关系运算符,可以让两个自定义对象进行对比操作
函数调用运算符重载
由于重载之后使用的方法非常像函数的调用,因此称为仿函数
仿函数没有固定写法,非常灵活。

//函数调用运算符()也可以重载
//由于重载后使用的方式非常像函数的调用,因此称为仿函数
//仿函数没有固定写法,非常灵活
#include <iostream>
#include <string>
using namespace std;
class Person {
	//默认构造函数
	//默认析构函数
	//默认拷贝构造函数
	//赋值运算符重载
public:
	void operator() (string text){
		cout << text << endl;
	}
};
void test00() {
	//重载的()操作符,也称为仿函数
	Person xiaoming;
	xiaoming("大家好,我是小明");
	
}

class Myadd{
public:
	int operator()(int val1, int val2) {
		return val1 + val2;
	}
};
void test90() {
	Myadd myadd;
	int ret = myadd(10, 10);
	cout << "ret = " << ret << endl;
	//构建匿名对象 
	cout << Myadd()(20, 20) << endl;
}
int main() {
	test00();
	test90();
	return 0;
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页