1.(训练)数组类的封装
自己实现一个数组类.
2. 运算符重载
定义类的运算方法:提供成员/全局函数进行运算
- 语法:
- 成员函数下:
Person operator+(Person &p){};
->p1+(p2) - 全局函数下:
Person operator+(Person &p1,Person &p2){};
->(p1+p2)
- 成员函数下:
3. <<,>>运算符重载
左移运算符的重载<<,实现cout<<p1打印p1
不能写在成员函数内.只能用全局
- 第一个参数cout;第二个参数p1:(ostream &cout,Person &p1)
- 成员属性在public下:
ostream& operator<<(ostream &cout,Person & p1){
cout<<"a="<<p1.A<<"b="<<p1.B;
return cout;
}
- 成员属性在private下:(用友元)
全局函数写法和1相同;在类内添加友元声明:
friend ostream& operator<<(ostream &cout,Person & p1);
4. ++运算符重载
(1)前置
先+1,再返回值
- 成员函数下重载的写法:
//前置++
MyInt& operator++(){//++myInt
this->num++;
return *this;
}
- 左移运算符重载,这里忽略
- 调用的写法:
cout<< ++myInt << endl;
(2)后置
先返回值,再+1
用占位参数int
- 成员函数下重载的写法:
//后置++
MyInt operator++(int){//myInt++
//先保存数据
MyInt tmp=*this;
//后加1
this->num++;
//返回没加1的值
return tmp;
}
- 左移运算符重载,这里忽略
- 调用的写法:
cout<< myInt++ << endl;
5. 指针*,->运算符重载
智能指针的应用场景
(1)*
Person& operator*(){
return *this->person;
}
(2)->
6.赋值=运算符重载
c++会给类提供默认的=号重载函数,但对于堆区内容有浅拷贝深拷贝的问题.
7.[ ]运算符重载
int& operator[](int index){return this->pAdress[index]};
8. 关系>=,= =,<=,!=运算符重载
bool operator==(Person &p){};
9. 函数调用()运算符重载
仿函数:调用与类名相同的函数Person(...);
重载写法:void operator()(...){};
注意:
- Person(,)这是仿函数
- Person()(,)这是先弄了匿名对象,然后匿名对象调用仿函数
10.不要重载&&和||运算符!
11.符号重载总结
- =, [], () 和 -> 操作符只能通过成员函数进行重载
- << 和 >> 只能通过全局函数配合友元函数进行重载
- 不要重载 && 和 || 操作符,因为无法实现短路规则
![[Pasted image 20221007123720.png]]