C++运算符重载(类内、外重载)

更新时间:2023-07-14 07:38:48 阅读: 评论:0

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

本文发布于:2023-07-14 07:38:48,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1080892.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:重载   运算符   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图