第十一章 运算符重载

第十一章 运算符重载

1.  运算符重载

2.  在成员函数中实现自加

3.  重载前置自加运算符

返回类型 [email protected](参数表){}

@代表要重载的运算符

对象运算符重载不同于变量运算符重载

void operator++(){++n;}

++i;//等价于i.operator++();若i是变量 则++i就是调用operator++()

//n=++i;错误原因:右值为一个无符号的返回型

//1+2;等价于operator+(1+2),此时

4.  创建临时对象

见程序

5.  创建无名临时对象

返回含参构造函数

6.  取消创建临时对象

返回*this

7.  重载后置自加运算符

8.  重载加法运算函数operator+

11.  重载赋值运算函数operator=

10.  转换类型运算符

我们可以调用构造函数进行类型转换将一个变量赋给一个对象,但是反过来就不可以。(如果没有重载)

11.  重载限定

“.”成员选择运算符

“::”作用域限定运算符

“*”指针运算符

本章总结:


  1 /**
2 成员数据为非指针时 operator重载函数的定义
3 */
4
5 //#include"iostream"
6 //using namespace std;
7 //class A
8 //{
9 //public:
10 // A(){cout<<"执行无参构造函数\n";}
11 // A(int a){this->n=a;cout<<"执行带参构造函数"<<n<<endl;}
12 // A(A &r){n=r.n;cout<<"执行复制构造函数\n";}
13 // ~A(){cout<<"执行析构函数\n";}
14 // int get(){return n;}
15 // void set(int x){n=x;}
16 //
17 // A &operator++(){cout<<"执行++operator"<<endl;n++;return *this;}//用this时要调用复制构造函数,又因为this是全局变量,
18 // //所以可以设为按别名返回,避免调用复制构造函数
19 // //A operator++(){cout<<"执行++operator"<<endl;++n;A num(n);return num;}//这个要调用复制构造函数
20 //
21 // A operator++(int o){cout<<"执行operator++"<<endl;A num(n);n++;return num;}
22 //
23 // A operator+(A &r){cout<<"执行operator+"<<endl;return A(n+r.n);}//object1.operator+(object2)不会调用复制构造函数,
24 // //只会调用构造函数创建一个临时的对象
25 //
26 // A operator-(A &r){return A(n-r.n);}
27 //
28 // A operator*(A &r){return A(n*r.n);}
29 //
30 // A operator/(A &r){return A(n/r.n);}
31 //
32 // A &operator=(A &r)
33 // {
34 // cout<<"执行operator="<<endl;
35 // if(this==&r) //判断启调对象与被调对象是否为同一个地址
36 // return *this;
37 // else
38 // this->n=r.n;
39 // return *this;
40 // }
41 //private:
42 // int n;
43 //
44 //};
45 //int main()
46 //{
47 // A object1(1);
48 // A object2(2);
49 // A object3;
50 // object3=object1+object2;//这里优化了,不再调用复制构造函数
51 // cout<<object3.get()<<endl;
52 // A x(9);
53 // x=object3++;
54 // x=++object3;
55 // cout<<x.get()<<endl;
56 // cout<<object3.get()<<endl;
57 // return 0;
58 //}
59
60
61
62 /**
63 成员数据为指针时 operator重载函数的定义
64 注意:当成员函数 不是常用变量 就要重新定义 运算符重载函数
65 */
66
67
68 //#include<iostream>
69 //using namespace std;
70 //class A
71 //{
72 //public:
73 // A(){n=new int;cout<<"执行无参构造函数\n";}
74 // A(int i){n=new int;*n=i;cout<<"执行有参构造函数\n";}
75 // A(A &r){n=new int;*n=*r.n;cout<<"执行复制构造函数\n";} //两块不同空间里的值相互复制
76 // ~A(){delete n;n=NULL;cout<<"执行析构函数\n";}
77 // int get(){return *n;}
78 // void set(int x){*n=x;}
79 // //A &operator++(){++n;return *this;}
80 // A &operator++(){++(*n);return *this;}
81 // //A operator++(int o){A temp(n);++n;return temp;}
82 // A operator++(int o){A temp(*n);++(*n);return temp;}
83 // //A operator+(A &r){return A(n+r.n);}
84 // A operator+(A &r){return A(*n+*r.n);}
85 // //A operator-(A &r){return A(n-r.n);}
86 // A operator-(A &r){return A(*n-(*(r.n)));}
87 // //A operator*(A &r){return A(n*r.n));}
88 // A operator*(A &r){return A(*n*(*(r.n)));}
89 // //A operator/(A &r){return A(n/r.n);}
90 // A operator/(A &r){return A(*n/(*(r.n)));}
91 // A &operator=(A &r)
92 // {
93 // if(this==&r)
94 // return *this;
95 // else
96 // *(this->n)=*(r.n);
97 // return *this;
98 // }
99 //private:
100 // int *n; //指针就像一把万能钥匙,要想利用这把钥匙就必须要有对应的空间
101 //};
102 //int main()
103 //{
104 // A a(1);
105 // A b(3);
106 // A c(5);
107 // A x;
108 // ++a;
109 // cout<<a.get()<<endl;
110 // x=a++;
111 // cout<<x.get()<<endl;
112 // cout<<a.get()<<endl;
113 // a=b+c;
114 // cout<<a.get()<<endl;
115 // a=b-c;
116 // cout<<a.get()<<endl;
117 // a=b*c;
118 // cout<<a.get()<<endl;
119 // a=b/c;
120 // cout<<a.get()<<endl;
121 //
122 // return 0;
123 //}
124
125
126
127
128 /**
129 利用operator进行类型转换
130 我们可以调用构造函数进行类型转换将一个变量赋给一个对象,但是反过来就不可以。(如果没有重载)
131 */
132
133 #include<iostream>
134 using namespace std;
135 class A
136 {
137 public:
138 A(){cout<<"执行无参构造函数\n";}
139 A(double i){n=i;cout<<"执行含参构造函数\n";}
140 A(A &r){cout<<"执行复制构造函数\n";}
141 ~A(){cout<<"执行析构函数\n";}
142 int get(){return n;}
143 void set(int x){n=x;}
144 operator double(){return n;}//没有返回类型但可以有返回值;没有参数但可以传参
145 private:
146 double n;
147 };
148 int main()
149 {
150 A object1(9.9);
151 cout<<double(object1)<<endl;//显示转换
152 cout<<(object1)<<" "<<object1<<endl;//隐式转换
153 double x;
154 x=object1;
155 cout<<x<<endl;//隐式转换
156 return 0;
157 }

第十一章 运算符重载

时间: 2024-11-10 05:10:57

第十一章 运算符重载的相关文章

《C++编程思想》 第十一章 运算符重载 (习题+解答)

一.相关代码 1. /*运算符重载语法*/ /*OPOVER.cpp*/ /*这两个重载的运算符被定义为内联成员函数.对于二元运算符,单个参数是出现在运算符 右侧的那个.当一元运算符被定义为成员函数时,没有参数.成员函数被运算符左侧的对象调 用. 对于非条件运算符(条件运算符通常返回一个布尔值),如果两个参数是相同的类型,希 望返回和运算相同类型的对象或引用.如果它们不是相同类型,它作什么样的解释就取决于程 序设计者.用这种方法可以组合复杂的表达式: K += I + J ; 运算符+号产生一个

sdut 面向对象程序设计上机练习十一(运算符重载)

面向对象程序设计上机练习十一(运算符重载) Time Limit: 1000MS Memory limit: 65536K 题目描述 有两个矩阵a和b,均为2行3列,求两个矩阵之和.重载运算符"+",使之能用于矩阵相加.如:c=a+b. 输入 第1.2行是矩阵a的值,数据以空格分开. 第3.4行是矩阵b的值,数据以空格分开. 输出 2个矩阵a.b之和,以行列形式显示. 示例输入 2 3 4 3 5 3 4 3 1 5 4 3 示例输出 6 6 5 8 9 6 来源 #include &

面向对象程序设计上机练习十一(运算符重载)

面向对象程序设计上机练习十一(运算符重载) Time Limit: 1000MS Memory limit: 65536K 题目描述 有两个矩阵a和b,均为2行3列,求两个矩阵之和.重载运算符“+”,使之能用于矩阵相加.如:c=a+b. 输入 第1.2行是矩阵a的值,数据以空格分开. 第3.4行是矩阵b的值,数据以空格分开. 输出 2个矩阵a.b之和,以行列形式显示. 示例输入 2 3 4 3 5 3 4 3 1 5 4 3 示例输出 6 6 5 8 9 6 #include <iostream

PKU C++程序设计实习 学习笔记4 运算符重载

第四章 运算符重载 4.1 运算符重载的基本概念 1. 运算符 2. 自定义数据类型与运算符重载 C++提供了数据抽象的手段:用户自己定义数据类型 -- 类 ? 调用类的成员函数->操作它的对象 类的成员函数->操作对象时,很不方便 ? 在数学上,两个复数可以直接进行+/-等运算 Vs. 在C++中,直接将+或-用于复数是不允许的 3. 运算符重载 对抽象数据类型也能够直接使用C++提供的运算符 ? 程序更简洁 ? 代码更容易理解 运算符重载 ? 对已有的运算符赋予多重的含义 ? 使同一运算符

c++第九章-(运算符重载)

一些规则 1.c++不允许用户自己定义新的运算符,只能对已有的c++运算符进行重载. 2.除了五个运算符不允许重载外,其他运算符允许重载: .成员访问运算符 *成员指针访问运算符 ::与运算符 sizeof尺寸运算符 ?:条件运算符 3.重载运算符必须和用户定义的自定义类型的对象一起使用.(也就是说,参数不能全部都是c++的标准类型,这样约定是为了防止用户修改用于标准类型结构的运算符性质) 4.为什么运算符重载函数有两个参数,只需有一个参数? 其实是有一个参数是隐含着的,运算符函数是用this指

流畅python学习笔记:第十三章:重载运算符__add__,__iadd__,__radd__,__mul__,__rmul__,__neg__,__eq__,__invert__,__pos__

在前面第十章以及第一章的时候介绍了Vector对象的运算符重载.第十三章专门介绍运算符重载.这里我们看几个之前没讲过的运算符__neg__,__pos__,__invert__ class Vector(object):     def __init__(self,x):         self.x=x     def __neg__(self):         return "Vector(%d)" % (-self.x)     def __str__(self):      

《Inside C#》笔记(十一) 运算符重载

运算符重载与之前的索引器类似,目的是为了让语言本身使用起来更方便直接,也是一种语法糖. 一 运算符重载(Operator Overloading) 运算符重载的存在,使得现有的各种运算符可以被重新定义并用来操作用户自定义的数据类型.运算符重载只是语法糖,因为它的本质实际上还是对方法的调用,并没有为语言本身增加新特性. a) 运算符重载的写法 public static <返回值>operator<运算符> (<参数1>,<参数2>-) 还有一些规则: 必须用

c++ primer 5th 笔记:第十一章

第十一章:关联容器 笔记 1. 关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的.与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的. 2. 关联容器支持高效的关键字查找和访问,两个主要的关联容器类型是map和set.map中的元素是一些关键字-值对:关键字起到索引的作用,值则表示与索引相关联的数据.set中每个元素只包含一个关键字:set支持高效的关键字查询操作--检查一个给定关键字是否在set中. 3. 当从map中提取一个元素时,会得到一个pair

运算符重载(二)

在<运算符重载(一)>我们介绍了运算符重载的基本概念,以及基本形式.那么再运算符重载中,参数的传递有什么遵循的原则?返回值的类型又遵循什么原则呢?这些问题都 在这一篇文章中回答. (1)运算符重载函数中的参数个数应该有几个 运算符重载函数的参数个数取决于两个因素.一是运算符是一元运算符还是二元运算符,二是采用友元函数重载还是采用成员函数重载 如果是一元运算符,采用友元函数重载就要有一个参数,采用成员函数重载,就不需要参数(因为成员函数隐式的传递了this指针) 1 class Integer{