单目运算符的重载
- 格式:ppt
- 大小:1.09 MB
- 文档页数:11
1.概念填空题1.1运算符重载是对已有的运算符赋予多重含义,使同一个运算符在作用于不同类型对象时导致不同的行为。
运算符重载的实质是函数重载,是类的多态性特征。
1.2可以定义一种特殊的类型转换函数,将类的对象转换成基本数据类型的数据。
但是这种类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
类类型转换函数既没有参数,也不显式给出返回类型。
类类型函数中必须有return 表达式的语句返回函数值。
一个类可以定义多个类类型转换函数。
1.3运算符重载时其函数名由operator运算符构成。
成员函数重载双目运算符时,左操作数是对象,右操作数是函数参数。
2.简答题2.2简述运算符重载的规则。
2.2简述重载单目运算符++、--,前置和后置时的差别。
2.3 C++中重运算符是否都可以重载?是否都可以重载成类的成员函数?是否都可以重载成类的友元函数?2.4 构造函数作为类型转换函数的条件是什么。
3.选择题3.1在下列运算符中,不能重载的是(B)A.!B. sizeofC. newD. delete3.2 不能用友员函数重载的是(A)。
A.=B.==C.<=D.++3.3下列函数中,不能重载运算符的函数是(B)。
A.成员函数B.构造函数C.普通函数D.友员函数3.4如果表达式++i*k时中的”++”和”*”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为(B)。
A.operator*(i.operator++(),k) B.operator*(operator++(i),k)C.i.operator++().operator*(k) D.k.operator*(operator++(i))3.5已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;下列关于这个函数的叙述中,错误的是(B )。
A.这是运算符-的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变数据成员的值3.6在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。
C++基础系列——运算符重载1. 运算符重载简介所谓重载,就是赋予新的含义。
函数重载(Function Overloading)可以让⼀个函数名有多种功能,在不同情况下进⾏不同的操作。
同样运算符重载(Operator Overloading)可以让同⼀个运算符可以有不同的功能。
可以对 int、float、string 等不同类型数据进⾏操作<< 既是位移运算符,⼜可以配合 cout 向控制台输出数据也可以⾃定义运算符重载:class Complex{public:Complex();Complex(double real, double imag);Complex operator+(const Complex &a) const;void display() const;private:double m_real;double m_imag;};// ...// 实现运算符重载Complex Complex::operator+(const Complex &A) const{Complex B;B.m_real = this->m_real + A.m_real;B.m_imag = this -> m_imag + A.m_imag;return B;// return Complex(this->m_real + A.m_real, this->m_imag + A.m_imag);}int main(){Complex c1(4.3, 5.8);Complex c2(2.7, 3.7);Complex c3;c3 = c1 + c2; // 运算符重载c3.display();return 0;}运算结果7 + 9.5i运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。
详解C++编程中的单⽬运算符重载与双⽬运算符重载C++单⽬运算符重载单⽬运算符只有⼀个操作数,如!a,-b,&c,*p,还有最常⽤的++i和--i等。
重载单⽬运算符的⽅法与重载双⽬运算符的⽅法是类似的。
但由于单⽬运算符只有⼀个操作数,因此运算符重载函数只有⼀个参数,如果运算符重载函数作为成员函数,则还可省略此参数。
下⾯以⾃增运算符”++“为例,介绍单⽬运算符的重载。
[例] 有⼀个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次⾛⼀秒,满60秒进⼀分钟,此时秒⼜从0开始算。
要求输出分和秒的值。
#include <iostream>using namespace std;class Time{public:Time( ){minute=0;sec=0;} //默认构造函数Time(int m,int s):minute(m),sec(s){ } //构造函数重载Time operator++( ); //声明运算符重载函数void display( ){cout<<minute<<":"<<sec<<endl;} //定义输出时间函数private:int minute;int sec;};Time Time::operator++( ) //定义运算符重载函数{if(++sec>=60){sec-=60; //满60秒进1分钟++minute;}return *this; //返回当前对象值}int main( ){Time time1(34,0);for (int i=0;i<61;i++){++time1;time1.display( );}return 0;}运⾏情况如下:34:134:2┆34:5935:035:1 (共输出61⾏)可以看到:在程序中对运算符“++”进⾏了重载,使它能⽤于Time类对象。
简述运算符重载的规则。
运算符重载是指可以为自定义的类类型或枚举类型定义新的含义和功能。
在
C++中,运算符重载遵循以下一般规则:
1. 运算符重载必须至少有一个操作数是用户自定义的类类型或枚举类型的对象,否则将无法重载。
2. 运算符重载可以作为成员函数或非成员函数来实现。
3. 对于成员函数的运算符重载,操作数的数量为运算符的操作数减去1。
例如,重载双目运算符时(如+、-、*等),成员函数需要接受一个参数,用于表示另一个操作数。
4. 对于非成员函数的运算符重载,所有操作数都作为参数传递给函数。
可以通过将重载运算符函数声明为友元函数来访问类的私有成员。
5. 对于重载一元运算符(如++、),如果是成员函数,则返回一个修改后的对象;如果是非成员函数,则返回一个新的对象。
6. 对于重载二元运算符(如+、-、*等),如果是成员函数,则一个对象被修改,另一个对象不变;如果是非成员函数,则返回一个新的对象。
7. 运算符重载不能改变原有运算符的优先顺序和结合性。
8. 运算符重载遵循函数重载的规则,即可以根据参数类型和参数数量进行重载,实现不同的功能。
需要注意的是,运算符重载应该遵循语义上的合理性并不滥用。
C++运算符重载三种形式(成员函数,友元函数,普通函数)详解三种重载⽅式⾸先,介绍三种重载⽅式:1//作为成员函数重载(常见)2class Person{3 Private:4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}8bool operator<(const Person& b);910 };11bool Person::operator<(const Person& b)12 {13//作为成员函数时,*this即为左操作数a14 ...15 }1//作为友元函数重载2class Person{3private:4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}8 friend bool operator<(const Person& a,const Person& b);910 };11bool operator<(const Person& a,const Person& b)12 {13 ...14 }1//作为普通函数重载(不推荐)2class Person{3public://注意,重载运算符为普通函数时,使⽤到的类成员必须为public4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}89 };10bool operator<(const Person& a,const Person& b)11 {12 ...13 }作为成员函数重载先介绍第⼀种:bool Person::operator<(const Person& b),bool是函数返回类型,Person::只是指定了成员函数所属类名。
C++学习之路—运算符重载(⼆)运算符重载作为类的成员函数和友元函数对运算符重载的函数有两种处理⽅式:(1)把运算符重载的函数作为类的成员函数;(2)运算符重载的函数不是类的成员函数,在类中把它声明为友元函数。
1 把运算符重载函数作为类的成员函数例1:为了便于说明问题,将重载函数的定义重写如下:1: Complex Complex :: operator + ( Complex& c2 )2: {3: Complex c ;4: c.real = real + c2.real ;5: c.imag = imag + c2.imag ;6:return c ;7: }有⼈可能会提出这样的疑问:“+”是双⽬运算符,为什么重载函数只有⼀个参数呢?实际上,运算符重载函数应当有两个参数,但是,由于重载函数是Complex类中的成员函数,因此有⼀个参数是隐含的,运算符函数是⽤this指针隐式的访问类对象的成员。
可以看到operator+访问了两个对象中的成员,⼀个是this指针指向的对象中的成员,⼀个是形参对象中的成员。
2 把运算符重载函数作为类的友元函数运算符重载函数除了可以作为类的成员函数外,还可以是⾮成员函数。
在有关的类中把它声明为友元函数,即友元运算符重载函数。
例2:将运算符+重载为适⽤于复数加法,重载函数不作为成员函数,⽽放在类外,作为Complex类的友元函数。
1:class Complex2: {3:public:4: ...5:friend Complex operator + ( Complex& c1 , Complex& c2 ) ; //重载函数作为友元函数6:private:7:double real ;8:double imag ;9: };10:11: Complex operator + ( Complex& c1 , Complex& c2 ) //定义运算符+重载函数12: {13: Complex c ;14: c.real = c1.real + c2.real ;15: c.imag = c1.imag + c2.imag ;16:return c ;17: }这个程序和把运算符重载函数作为类的成员函数相⽐,只做了⼀处改动,就是将运算符重载函数作为类外的普通函数,并在Complex类中声明它为友元函数。
简述运算符重载的规则。
运算符重载是C语言中的一种语法特性,允许程序员在函数内部重载运算符,以改变其操作类型和参数类型。
运算符重载可以用于实现一些复杂的逻辑,也可以用于提高代码的灵活性和可重用性。
运算符重载的规则如下:
1. 运算符重载只能重载算术运算符和逻辑运算符,不能重载关系运算符(如+、-、*、/等)。
2. 运算符重载的重载点必须在函数内部,不能跨越函数调用。
3. 运算符重载的参数类型必须与运算符的类型相同或相似,且参数类型之间的运算符必须兼容。
4. 运算符重载的函数必须声明在头文件中,并且必须在文件定义之前声明。
5. 运算符重载的函数可以重载多个运算符,但是不能重复重载同一个运算符。
6. 运算符重载的函数可以修改原始运算符的行为,比如将一个算术运算符重载为逻辑运算符。
7. 运算符重载的函数可以改变运算符的顺序,比如将一个逻辑运算符重载为算术运算符。
8. 运算符重载的函数可以改变运算符的优先级,比如将一个逻辑运算符重载为算术运算符或者赋值运算符。
通过运算符重载,程序员可以实现一些复杂的逻辑,比如将一个算术运算符重载为逻辑运算符,以进行条件判断和流程控制。
运算符重载还可以提高代码的
灵活性和可重用性,因为不同的函数可以分别实现不同的逻辑,而不必共享相同的代码。
除了常见的算术运算符重载和逻辑运算符重载外,C语言还支持一些其他的运算符重载,比如字符串比较运算符重载、字符串拼接运算符重载等。
程序员可以根据具体的需求和场景,灵活地使用运算符重载来实现不同的逻辑。
运算符重载详解1.运算符重载定义:C++中预定义的运算符的操作对象只能是基本数据类型。
但实际上,对于许多⽤户⾃定义类型(例如类),也需要类似的运算操作。
这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够⽤于特定类型执⾏特定的操作。
运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引⼈的特性之⼀。
运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进⾏的操作。
运算符函数的定义与其他函数的定义类似,惟⼀的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。
运算符函数定义的⼀般格式如下:<返回类型说明符> operator <运算符符号>(<参数表>){<函数体>} 2.运算符重载时要遵循以下规则:(1) 除了类属关系运算符"."、成员指针运算符".*"、作⽤域运算符"::"、sizeof运算符和三⽬运算符"?:"以外,C++中的所有运算符都可以重载。
(2) 重载运算符限制在C++语⾔中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。
(3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。
(4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。
(5) 运算符重载不能改变该运算符⽤于内部类型对象的含义。
它只能和⽤户⾃定义类型的对象⼀起使⽤,或者⽤于⽤户⾃定义类型的对象和内部类型的对象混合使⽤时。
(6) 运算符重载是针对新类型数据的实际需要对原有运算符进⾏的适当的改造,重载的功能应当与原有功能相类似,避免没有⽬的地使⽤重载运算符。
(7)重载运算符的函数不能有默认的参数,否则就改变了运算符的参数个数,与前⾯第3点相⽭盾了;(8)重载的运算符只能是⽤户⾃定义类型,否则就不是重载⽽是改变了现有的C++标准数据类型的运算符的规则了,会引会天下⼤乱的;(9)⽤户⾃定义类的运算符⼀般都必须重载后⽅可使⽤,但两个例外,运算符“=”和“&”不必⽤户重载;(10)运算符重载可以通过成员函数的形式,也可是通过友元函数,⾮成员⾮友元的普通函数。
运算符号重载:前置与后置单⽬运算++区别:就在于函数的形参,语法规定,前置单⽬运算符重载为成员函数时没有形参,后置单⽬运算符重重载为成员函数时需要⼀个int型形参,这个int型参数在函数体中并不使⽤,纯粹⽤来区别前置与后置。
课本上⼀个例⼦:#include<iostream>using namespace std;class Clock{public:Clock(int NewH=0,int NewM=0,int NewS=0);void ShowTime();Clock& operator ++();//前置单⽬运算符重载Clock operator ++(int);//后置单⽬运算符private:int Hour,Minute,Second;};Clock::Clock(int NewH,int NewM,int NewS){if(0<=NewH&&NewH<24&&0<=NewM&&NewM<60&&0<=NewS&&NewS<60){Hour=NewH;Minute=NewM;Second=NewS;}elsecout<<"Time error!"<<endl;}void Clock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}Clock& Clock::operator ++() //前置++,如++n,最后返回的是n.使⽤对象的引⽤{Second++;if(Second>=60){Second=Second-60;Minute++; if(Minute>=60) { Minute=Minute-60; Hour++; Hour=Hour%24; } } return *this;}Clock Clock::operator ++(int) //后置++,如n++,返回的是运算前的对象值n,不⽤引⽤。