C++学习笔记day15-函数运算符重载
2020-08-06 14:57
966 查看
1、加号运算符重载
#include<iostream> using namespace std; //加号运算符重载 //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; }; Person operator+(Person &p1, Person &p2) { Person temp; temp.m_A = p1.m_A + p2.m_A; temp.m_B = p1.m_B + p2.m_B; 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; cout << "p3.m_A= " << p3.m_A << endl; cout << "p3.m_B= " << p3.m_B << endl; } int main() { test01(); system("pause"); return 0; }
2、左移运算符重载
#include<iostream> using namespace std; //左移运算符重载 class Person { friend ostream & operator<<(ostream &cout, Person &p); public: Person(int a, int b) { m_A = a; m_B = b; } private: //利用成员函数重载 左移运算符 p.operator<<(cout) 简化版本 p<<cout //不会利用成员函数重载<<运算符,因为无法实现cout 在左侧 /*void operator<<(cout) { }*/ int m_A; int m_B; }; //只能利用全局函数重载左移运算符 ostream & operator<<(ostream &cout,Person &p)//本质 operator<<(cout,p) 简化cout<<p { 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;*/ cout << p<<endl; } int main() { test01(); system("pause"); return 0; }
3、递增运算符重载
#include<iostream> using namespace std; //重载递增运算符 //自定义整型 class MyInteger { friend ostream & operator<<(ostream &cout, MyInteger myint); public: MyInteger() { m_Num = 0; } //重载前置++运算符,返回引用为了一直对一个数据进行递增操作 MyInteger& operator++() { //先进行++运算 m_Num++; //再将自身做返回 return *this; } //MyInteger operator++(int) int代表占位参数,可以区分前置和后置递增 MyInteger operator++(int) { //先 记录当时结果 MyInteger temp = *this; //后 递增 m_Num++; //最后将记录结果做返回 return temp; } //重载后置++运算符 private: int m_Num; }; void test01() { MyInteger myint; cout << ++(++myint) << endl; cout << myint << endl; } void test02() { MyInteger myint; cout << myint++ << endl; cout << myint << endl; } //重载<<运算符 ostream& operator<<(ostream& cout, MyInteger myint) { cout << myint.m_Num; return cout; } int main() { //test01(); test02(); system("pause"); return 0; }
4、赋值运算符重载
#include<iostream> using namespace std; //赋值运算符重载 class Person { public: Person(int age) { m_Age=new int(age); } ~Person() { if (m_Age != NULL) { delete m_Age; m_Age = NULL; } } //重载 赋值运算符 Person& operator=(Person &p) { //编译器是提供浅拷贝 //m_Age =p.m_Age; //应该先判断是否有属性在堆区,如果有先释放干净,然后再深拷贝 if (m_Age != NULL) { delete m_Age; m_Age = NULL; } m_Age = new int(*p.m_Age); return *this; } 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(); system("pause"); return 0; }
5、关系运算符重载
#include<iostream> #include<string> using namespace std; //重载关系运算符 class Person { public: Person(string name, int age) { m_Name = name; m_Age = age; } //重载 ==号 bool operator==(Person &p) { if (this->m_Name == p.m_Name&&this->m_Age == p.m_Age) { return true; } return false; } bool operator!=(Person &p) { if (this->m_Name == p.m_Name&&this->m_Age == p.m_Age) { return false; } return true; } string m_Name; int m_Age; }; void test01() { Person p1("Tom", 18); Person p2("Tom", 18); if (p1 == p2) { cout << "p1和p2是相等的" << endl; } else { cout << "p1和p2是不相等的" << endl; } } int main() { test01(); system("pause"); return 0; }
6、函数调用运算符重载
#include<iostream> #include<string> using namespace std; //函数调用运算符重载 //打印输出类 class MyPrint { public: //重载函数调用运算符 void operator()(string test) { cout << test << endl; } }; void MyPrint02(string test) { cout << test << endl; } void test01() { MyPrint myPrint; myPrint("Hello world");//由于使用起来非常类似于函数调用,因此称为仿函数 MyPrint02("hello world"); } //仿函数非常灵活,没有固定写法 //加法类 class MyAdd { public: int operator()(int num1,int num2) { return num1 + num2; } }; void test02() { MyAdd myadd; int ret = myadd(100, 100); cout << "ret= " << ret << endl; //匿名函数对象 cout << MyAdd()(100, 100) << endl; } int main() { //test01(); test02(); system("pause"); return 0; }
相关文章推荐
- 学习笔记(05):C++语言基础视频教程-4.4 三种运算符重载函数
- C++中虚函数学习笔记
- Inside the C++ Object Model 学习笔记 第四章 函数语意学
- C++学习笔记8,const在函数方面的使用(二)
- c++学习笔记:void*变量,在函数内必须要明确变量类型
- C++学习笔记之函数如何返回字符串(char型)
- C++学习笔记6--高级强制类型转换 命名空间和模块化编程 C预处理器 链接和作用域 函数模板 类模板 内联模板 容器和算法
- C++学习笔记7 C++函数的升级 上
- [C++学习笔记]自定义函数的传值方法
- C++学习序列笔记之函数原型和函数定义
- 【菜鸟C++学习笔记】25.函数重载
- C++学习笔记23,类内函数重载
- 新手学习C++笔记4:函数的原型化与重载
- C++学习笔记24 函数模板
- C++学习笔记(3)——成员变量、成员函数的指针
- C++pirmer 学习笔记之函数定义
- Effective c++学习笔记——条款5:了解C++默默编写并调用哪些函数
- c++学习笔记之函数的调用和返回
- C++学习笔记之函数
- C++学习笔记之指向函数的指针