Explorar o código

上传文件至 '运算符重载1'

Creamo %!s(int64=2) %!d(string=hai) anos
pai
achega
61370b87fd

+ 117 - 0
运算符重载1/1、加号运算符重载.cpp

@@ -0,0 +1,117 @@
+//4.5  运算符重载
+
+//运算符重载概念:对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型
+
+
+
+//4.5.1
+
+//作用:实现两个自定义数据类型相加的运算
+
+#if(0)
+
+#include <iostream>
+
+//➕号运算符重载
+
+//1、成员函数重载?
+
+//2、全局函数重载?
+
+
+class Person
+{
+public:
+
+	//1、通过成员函数重载+
+
+	//Person operator+(Person& p)
+	//{
+	//	Person temp;
+	//	temp.m_A = this->m_A + p.m_A;
+	//	temp.m_B = this->m_B + p.m_B;
+
+	//	return temp;
+	//}
+
+	int m_A;
+
+	int m_B;
+
+	
+
+
+
+};
+
+
+//2、通过全局函数重载+号
+Person operator+(Person& p1, Person& p2)
+{
+	Person temp;
+
+	temp.m_A = p1.m_A + p2.m_A;
+	temp.m_B = p2.m_B + p2.m_B;
+
+	return temp;
+}
+
+//函数重载的版本
+Person operator+(Person& p1, int num)
+{
+	Person temp;
+
+	temp.m_A = p1.m_A + num;
+	temp.m_B = p1.m_B + num;
+
+	return temp;
+}
+
+void test01()
+{
+	Person p1;
+
+	p1.m_A = 10;
+	p1.m_B = 10;
+	
+	Person p2;
+
+	p2.m_A = 10;
+	p2.m_B = 10;
+
+	//成员函数重载本质的调用
+
+	//Person p3 = p1.operator+(p2);
+
+	//全局函数重载本质的调用
+	
+	//Person p3 = operator+(p1, p2);
+
+	Person p3 = p1 + p2;
+
+	//运算符重载也可以发生函数重载
+	Person p4 = p1 + 100;        //Person + int
+
+	std::cout << "p3.m_A = " << p3.m_A << std::endl;
+	std::cout << "p3.m_B = " << p3.m_B << std::endl;
+
+	std::cout << "p4.m_A = " << p4.m_A << std::endl;
+	std::cout << "p4.m_B = " << p4.m_B << std::endl;
+}
+
+
+
+int main()
+{
+	test01();
+
+	system("pause");
+
+	return 0;
+
+}
+
+//总结1 :对于内置的数据类型的表达式的运算符是不可能改变的
+//总结2 :不要滥用运算符重载
+
+#endif

+ 62 - 0
运算符重载1/2、左移运算符重载.cpp

@@ -0,0 +1,62 @@
+//4.5.2    左移运算符重载
+
+//作用 : 可以输出自定义数据类型
+
+#if(0)
+
+#include <iostream>
+
+
+class Person
+{
+public:
+	Person(int a , int b)
+	{
+		m_A = a;
+		m_B = b;
+	}
+
+	friend std::ostream& operator<<(std::ostream& cout, Person& p);
+
+
+	//利用成员函数重载 左移运算符  p.operator<<(cout)  简化版本  p << cout
+	//不会利用成员函数重载<<运算符,因为无法实现 cout 在左侧
+
+	//void operator<< (cout)
+	//{
+
+	//}
+
+private:
+	int m_A;
+	int m_B;
+};
+
+//只能利用全局函数重载左移运算符
+std::ostream& operator<<(std::ostream &cout , Person &p)       //本质  operator<< (cout,p)  简化 cout << p
+{
+	std::cout << "m_A = " << p.m_A << " m_B = " << p.m_B;
+
+	return cout;
+}
+
+
+void test01()
+{
+	Person p(10,10);
+	//p.m_A = 10;
+	//p.m_B = 10;
+
+	std::cout << p << std::endl;
+}
+
+int main()
+{
+	test01();
+
+	system("pause");
+
+	return 0;
+}
+
+#endif

+ 91 - 0
运算符重载1/3、递增运算符重载.cpp

@@ -0,0 +1,91 @@
+//4.5.3  递增运算符重载
+
+//作用:通过重载递增运算符,实现自己的整形数据
+
+#if(0)
+
+
+#include <iostream>
+
+class MyInteger
+{
+	friend std::ostream& operator<<(std::ostream& cout, MyInteger myint); 
+
+public:
+	MyInteger()
+	{
+		m_Num = 0;
+	}
+	//重载前置++运算符   返回引用为了一直对一个数据进行递增操作
+	MyInteger& operator++()
+	{
+		//先进行++运算
+		m_Num++;
+
+		//再将自身做返回
+		return *this;
+	}
+
+	//重载后置++运算符
+	//void operator++(int)    int代表的是一个占位参数  可以用于区分前置和后置递增
+	MyInteger operator++(int)
+	{
+		//先    记录当时结果
+		MyInteger temp = *this;
+
+		//后    递增
+		m_Num++;
+
+		//最后将记录结果做返回
+		return temp;
+
+	}
+
+private:
+	int m_Num;
+
+};
+
+//重载<<运算符
+std::ostream& operator<<(std::ostream&cout , MyInteger myint)
+{
+	std::cout << myint.m_Num;
+	return cout;
+}
+
+void test01()
+{
+	MyInteger myint;
+
+	std::cout << ++(++myint) << std::endl;
+	std::cout << myint << std::endl;
+}
+
+void test02()
+{
+	MyInteger myint;
+
+	std::cout << myint++ << std::endl;
+	std::cout << myint << std::endl;
+}
+
+
+int main()
+{
+
+	//test01();
+	test02();
+
+	//int a = 0;
+	//std::cout << ++(++a) << std::endl;
+	//std::cout << a << std::endl;
+
+	system("pause");
+
+	return 0;
+
+}
+
+#endif
+
+//总结 :前置递增返回的是引用,后置递增返回的是值