C++运算符重载(类内、外重载)
1.概念
运算符的重载,实际是⼀种特殊的函数重载,必须定义⼀个函数,并告诉C++编译器,当遇到该运算符时就调⽤此函数来⾏使运算符功能。这个函数叫做运算符重载函数(常为类的成员函数)。
⽤函数的⽅式实现了(+ - * / []数组 && || 逻辑 等)运算符的重载。根据需求决定重载那些运算符,⽤到的时候再百度案例即可。
2.重载的基本格式
返回值类型 类名::operator 重载的运算符(参数表)
{undefined
……
}
operator 是关键字,它与重载的运算符⼀起构成函数名。
3.运算符重载的两种⽅法
⼆元运算符重载画猫的简笔画
1.类内重载
运⾏结果:x : 7 y : 7
重点:运算符重载是类内重载时,运算符重载函数作为类的成员函数,以上述代码为例 a + b 相当于 a 对象调⽤+⽅法并且传⼊参数时 b 对象。
2.类外重载(⽤友元函数的⽅法实现)#include <iostream>using namespace std ;class Point {public : Point (){}; Point (int x , int y ): x (x ),y (y ) {}; Point operator +(const Point &b ){ //类内重载,运算符重载函数作为类的成员函数 Point ret ; ret .x = this ->x + b .x ; ret .y = this ->y + b .y ; return ret ; } int x ,y ;};int main () { Point a (2,4),b (5,3); Point c = a + b ; //这⾥c++编译器会,⾃动去找 + 运算符的重载函数 cout << "x :" << c .x << endl ; cout <<"y :" << c .y << endl ;}
1
2
3
4
5
6
7
8
9
10
11
12
13
中华网新闻14
15
16
17
18
19
英语小学
20
21
22
⼀元运算符重载(注意:返回值当左值得时候,返回的是⼀个引⽤)
mp4音乐1.插⼊运算符重载>> and 提取运算符重载<<
以提取运算符重载<<;为例,cout 是 ostream 类的对象。ostream 类和 cout 都是在头⽂件 中声明的。ostream 类将<<;重载为。下⾯我们重载 << 使⽤cout输出a对象
输出结果:< Point>( 7, 7)
重点:另外应该会有⼈对ostream &operator<<(ostream &out , const Point &a)函数感到疑惑,⾸先在重载<<;时,返回值类型是ostream&, 第⼀个参数也是ostream& 。也就是说,表达式cout<<c 的返回值仍是 cout ,所以cout<<c<<endl;才能成⽴。#include <iostream>using namespace std ;class Point {public : Point (){}; Point (int x , int y ): x (x ),y (y ) {}; friend Point operator +(const Point &, const Point &); //声明类的友元函数 int x ,y ;};Point operator +(const Point &a ,const Point &b ){//类外重载,运算符重载函数作为类的友元函数 Point ret ; ret .x = a .x + b .x ; ret .y = a .y + b .y ; return ret ;}int main () { Point a (2,4),b (5,3); Point c = a + b ; cout << "x :" << c .x << endl ; cout <<"y :" << c .y << endl ;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
杨家将家谱
17
18
19
20
21
22
23
24#include <iostream>using namespace std ;class Point {public : Point (){}; Point (int x , int y ): x (x ),y (y ) {}; friend ostream &operator <<(ostream &out , const Point &a ); //因为 << 是C++提供的类,我们⽆法访问,只能⽤友元函数。private : int x ,y ;};//<< 运算符重载的函数实现 ostream
是输⼊输出流的类ostream &operator <<(ostream &out , const Point &a ){ out << "<Point>( " << a .x << ", " << a .y << ")"; return out ;}int main () { cout << c << endl ; //直接输出类会报错,需要上⾯的 << 运算符重载}
1
2
3
4
5
6
7
8
9
10
11
12考生号是什么
13
14
15
16
17
18
19
20
炎症用什么药最好
21
22
2.前置运算符重载++ and 后置运算符重载++
重点:为区别前置和后置运算符,C++编译器要求,需要在后置运算符重载函数中加参数“int”,这个类型在此除了以⽰区别之外并不代表任何实际含义;如果不加,编译器⽆法区分是前置++,还是后置++,导致报错。
3.=等号运算符重载
C++中,对类对象进⾏操作时,我们就不能只是简简单单地,对类对象⽤=进⾏操作。
当我们没有⾃⼰设计等号运算符的重载函数,编译器会⾃动⽣成⼀个浅拷贝的赋值运算符的重载函数。
浅拷贝:只是简单地将⼀个对象的内存数据赋值给另⼀个对象,如果这个对象成员变量引⽤了外部资源时(new ),那么这两个对象的成员变量都指向这个空间,当这两个对象⽣存周期结束时,进⾏析构,那么就会崩溃,对同⼀块内存我们delete 了两次。#include <iostream>using namespace std ;c
lass Point {public : Point (){}; Point (int x , int y ): x (x ),y (y ) {}; friend Point operator +(const Point &, const Point &); friend ostream &operator <<(ostream &out , const Point &a ); Point & operator ++(){ //前置++运算符,需要引⽤返回,不需要参数。返回⾃增后的值,且返回的是⼀个左值 this ->x ++; this ->y ++; return *this ; } //const 修饰返回值不能修改 const Point operator ++(int ){//后置++,不需要引⽤返回,需要参数区分。返回⾃增前的值,且返回的是⼀个右值 Point temp (x ,y ); //因为后置++,是先使⽤,后⾃++,所以这⾥要保存⼀个临时值,再++,返回的是临时值。 this ->x ++; this ->y ++; return temp ; }private : int x ,y ;};Point operator +(const Point &a ,const Point &b ){ Point ret ; ret .x = a .x + b .x ; ret .y = a .y + b .y ; return ret ;}ostream &operator <<(ostream &out , const Point &a ){ out << "<Point>(" << a .x << " , " << a .y << ")"; return out ;}int main () { Point a (2,4),b (5,3); Point c = a + b ; cout << c << endl ; c ++; cout << c << endl ; ++c ; cout << c << endl ;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
医疗废弃物的处理27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>using namespace std ;class Name {public : //main 函数中的问题 Name obj
2 = obj1; //解决⽅案: ⼿⼯的编写拷贝构造函数 使⽤深copy Name (const Name & obj ) { m_len = obj .m_len ; m_p = (char *)malloc (m_len + 1); strcpy (m_p , obj .m_p ); } //等号运算符重载函数 Name & operator =(Name &obj ) { //1.先释放旧的内存 if (this ->m_p != NULL ) { delete [] m_p ; m_len = 0; } //2.根据obj 分配内存⼤⼩ this ->m_len = obj .m_len ; this ->m_p = new char [m_len +1]; //加1,结束符'\n'。 //3.把obj 赋值 strcpy (m_p , obj .m_p ); //字符串的拷贝函数 return *this ; } ~Name () //析构函数 { if (m_p != NULL ) { free (m_p ); m_p = NULL ; m_len = 0; } }protected :private : char *m_p ; int m_len ; };void main (){ Name obj1("abcdefg"); Name obj2 = obj1; //C++编译器提供的 默认的copy 构造函数 浅拷贝,需要⼿⼯编写构造函数 Name obj3("obj3"); obj1 = obj2 = obj3; //调⽤等号运算符重载 cout <<""<<endl ; system ("pau"); return ;}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061