C++运算符重载

合集下载

c 运算符的重载习题答案

c  运算符的重载习题答案

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++基础系列——运算符重载

C++基础系列——运算符重载

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语言 重载 赋值运算符

c语言重载赋值运算符C语言作为一门高级编程语言,提供了丰富的功能以满足各种编程需求。

其中,运算符重载就是一项非常重要的特性。

运算符重载可以让程序员自定义已有运算符在新类型上的操作方式,使得语言更加灵活和强大。

本文将详细介绍C语言中赋值运算符的重载,包括重载的原理、步骤、方法以及注意事项。

1.C语言中的重载概念C语言中的运算符重载是指在已有的运算符上,根据运算对象的类型,赋予新的操作含义。

这种重载是基于类型的,不同类型之间的运算符重载有不同的处理方式。

运算符重载可以让原有运算符在特定类型上具有更符合语义的操作方式,例如对赋值运算符的重载可以让赋值操作更加直观。

2.赋值运算符的重载原理在C语言中,赋值运算符"="原本用于将右侧的值赋给左侧的变量。

当我们对赋值运算符进行重载时,实际上是将原有赋值操作转换为一个新的表达式,这个表达式中包含了重载后的赋值操作。

重载后的赋值运算符需要满足以下条件:- 重载后的赋值运算符仍为一个二元运算符。

- 重载后的赋值运算符的优先级和结合性与其他运算符保持一致。

- 重载后的赋值运算符需要考虑运算对象的类型,以实现正确的赋值操作。

3.重载赋值运算符的步骤与方法重载赋值运算符的步骤如下:- 定义一个函数,该函数的参数列表中包含一个或多个变量引用。

- 在函数体中,对传入的变量进行操作,以实现重载后的赋值操作。

- 使用函数返回值替换原赋值表达式中的右侧值。

以下是一个重载赋值运算符的示例:```c#include <iostream>class MyClass {public:void operator=(const MyClass& other) {// 实现重载后的赋值操作std::cout << "重载赋值运算符被调用" << std::endl;}};int main() {MyClass obj1;MyClass obj2;obj1 = obj2; // 调用重载后的赋值运算符return 0;}```4.重载赋值运算符的注意事项- 重载赋值运算符时,需要确保运算对象具有可赋值性。

c++运算符重载基础知识详解

c++运算符重载基础知识详解

c++运算符重载基础知识详解c++运算符重载基础知识详解实际上,很多C++运算符已经被重载。

eg:将*运算符用于地址,将得到存储在这个地址中的值,将他用于2个数字时,得到的将是他们的乘积。

C++根据操作数的数目和类型来决定采用哪种操作。

本文特意为大家收集整理了c++运算符重载基础知识详解,希望大家喜欢!C++允许将运算符重载扩展到用户定义的'类型。

例如,允许使用+将两个对象相加。

编译器将根据操作数的数目和类型决定使用加法定义。

运算符重载可以使代码看起来更自然。

例如,将2个数组相加是一种常见的运算。

通常,需要使用下面这样的for循环来实现:复制代码代码如下:for (int i = 0; i < 20; i++)evening[i] = sam[i] + janet[i]; // add element by element但在C++中,可以定义一个表示数组的类,并重载+运算符,于是便有这样的语句:total = arr1+arr2;一个计算时间的例子mytime.h复制代码代码如下:#include"stdafx.h"#include"MyTime.h"#includeint_tmain(intargc,_TCHAR*argv[]){//比导入整个名称空间更经济usingstd::cout;usingstd::endl;Timeplanning;Timecoding(2,50);Timefixing(5,55);Timetotal;cout<<"planningtime="; planning.Show();cout<<endl;cout<<"codingtime="; coding.Show();cout<<endl;cout<<"fixingtime=";fixing.Show();cout<<endl;total=coding.Sum(fixing);cout<<"coding.Sum(fixing)="; total.Show();cout<<endl;total=coding+fixing;cout<<"coding+fixing="; total.Show();cout<<endl;get);return0;}调用复制代码代码如下:#include"stdafx.h"#include"MyTime.h"#includeint_tmain(intargc,_TCHAR*argv[]) {//比导入整个名称空间更经济usingstd::cout;usingstd::endl;Timeplanning;Timecoding(2,50);Timefixing(5,55);Timetotal;cout<<"planningtime=";planning.Show();cout<<endl;cout<<"codingtime=";coding.Show();cout<<endl;cout<<"fixingtime=";fixing.Show();cout<<endl;total=coding.Sum(fixing);cout<<"coding.Sum(fixing)=";total.Show();cout<<endl;total=coding+fixing;cout<<"coding+fixing=";total.Show();cout<<endl;get);return0;}执行结果重点讲解1.sum函数中将参数声明为引用,可以提高运行效率,节省内存2.sum函数中,返回值不能是引用。

C_运算符重载_各类详细介绍

C_运算符重载_各类详细介绍
▪ 有关友元函数重载单目运算符后缀方式的表示方法,将在后 面介绍
▪ 说明
运算符重载函数 operator@()可以返回任何类型,甚至可 以是 void类型,但通常返回类型与它所操作的类的类型 相同,这样可使重载运算符用在复杂的表达式中。例如, 在例7-2中,可以将几个复数连续进行加、减、乘、除的 运算。
用友元函数重载单目运算符时,需要一个显式的操作数, 例7-3中,用友元函数重载单目运算符“-”
#include<iostream.h> class nclass{ int a,b; public:
nclass(int x=0,int y=0) { a=x;b=y;} friend nclass operator -(nclass obj); void show(); };
▪ complex operator+(complex com1,complex com2) { return complex(com1.real+com2.real,com1.imag+com2.imag;}
▪ 这种方法是直接将一个无名临时对象创建到主调函数中,那么 运行效率高于前一种。
▪ 单目运算符重载
nclass operator-(nclass obj) { obj.a=-obj.a;
obj.b=-obj.b; return obj;} void nclass::show() { cout<<"a="<<a<<" b"<<b;} ▪ main() ▪{ ▪ nclass ob1(10,20),ob2; ▪ ob1.show(); ▪ ob2=-ob1; ▪ ob2.show(); ▪ return 0; ▪}

C语言运算符的重载详解

C语言运算符的重载详解

C语⾔运算符的重载详解⽬录写⼀个Add函数为什么不⽤加号作为函数名运算符的重载上⾯问题解决总结写⼀个Add函数我们先讨论下⾯代码,并复习前⾯的内容class Complex{private:double Real, Image;public:Complex() :Real(0), Image(0) {}Complex(double r, double i) :Real(r), Image(i) {}~Complex() {}//Complex Add(const Complex* const this,const Complex &c)Complex Add(const Complex& x)const{Complex y;y.Real = Real + x.Real;y.Image = Image + x.Image;return y;//return Complex(this->Real + x.Real, this->Image + x.Image);}void Print(){cout << Real << "+" << Image << "i" << endl;}};int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1.Add(c2);c3.Print();return 0;}直接return可以使⽤⽆名函数直接代替将亡值对象,相⽐可以省⼀次对象的构建我们再分析如果我们使⽤引⽤返回Add函数const Complex& Add(const Complex& x)const{Complex y;y.Real = Real + x.Real;y.Image = Image + x.Image;return y;//return Complex(this->Real + x.Real, this->Image + x.Image);}若我们以引⽤返回,将亡值对象会创建在Add函数的栈帧中,然后返回将亡值地址,函数return结束该空间会被释放、若没有引⽤,构建⽆名对象也就是将亡值对象会构建在主函数的空间中,这⾥使⽤将亡值对象值给到c3是没有问题的我们查看对象的构造与析构class Complex{private:double Real, Image;public:Complex() :Real(0), Image(0) {}Complex(double r, double i) :Real(r), Image(i){cout << "Create:" << this << endl;}Complex(const Complex& x):Real(x.Real),Image(x.Image){cout << "Copy Create:" << this << endl;}~Complex(){cout << "~Complex:" << this << endl;}//Complex Add(const Complex* const this,const Complex &c)Complex Add(const Complex& x)const{return Complex(this->Real + x.Real, this->Image + x.Image);}void Print(){cout << Real << "+" << Image << "i" << endl;}};int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1.Add(c2);c3.Print();return 0;}⾸先我们使⽤引⽤返回需要加上const修饰,这是因为我们返回将亡值在临时空间具有常性,所以普通引⽤是不能进⾏返回的,需要使⽤常引⽤返回const Complex& Add(const Complex& x)const{return Complex(this->Real + x.Real, this->Image + x.Image);}我们发现对临时对象的构建后马上就进⾏析构,那么是怎么将数据拿出给到c3的?这个在最后我们进⾏分析为什么不⽤加号作为函数名//Complex operator+(const Complex* const this,const Complex &c)Complex operator+(const Complex &c) const{return Complex(this->Real + x.Real, this->Image + x.Image);}这⾥是不可以的,加号是⼀个操作符,不能使⽤操作放作为有效的函数名称;但是在C++中为了使这些操作符号能够当作函数名,那么我们需要在前⾯加上⼀个关键字operator//Complex operator+(const Complex* const this,const Complex &c)Complex operator+(const Complex &c) const{return Complex(this->Real + x.Real, this->Image + x.Image);}也就是告诉编译器,加号是⼀个有效的函数名,这就叫做运算符的重载;随后我们之间使⽤ c3 = c1 + c2 就是可以的int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1 + c2;//编译器编译会是下⾯的情况//c3 = c1.operator+(c2);//c3 = operator+(&c1,c2); 加上this指针}运算符的重载⼀个对象,编译器会给它有6个缺省函数我们再来看下⾯这个问题//我们写⼀个赋值运算符重载void operator=(const Object& obj){this->value = obj.value;}//返回类型为void,这样不可以就不可以连等//obja = objb = objc;//obja = objb.operator=(objc);//obja = operator=(&objb,objc); 返回的⽆类型,不能给obja赋值且赋值函数不可以定义为const修饰Object& operator=(const Object& obj){this->value = obj.value;return *this;}obja = objb = objc;//改写obja = objb.operator=(objc);obja = operator=(&objb,objc);obja.operator=(operator=(&objb,objc));operator=(&obja,operator=(&objb,objc));通过返回对象,就可以实现连等;并且我们可以通过引⽤返回,因为此对象的⽣存期并不受函数的影响,不会产⽣⼀个临时对象作为⼀个过度防⽌⾃赋值若是我们将obja给obja赋值,也就是⾃赋值obja = objaoperator=(&obja,obja);我们就需要进⾏⼀步判断Object& operator=(const Object& obj){if(this != &obj)//防⽌⾃赋值{this->value = obj.value;}return *this;}上⾯问题解决我们通过这段代码来看,与上⾯问题相同Object& operator=(const Object& obj){if (this != &obj){this->value = obj.value;}return *this;}};Object& fun(const Object& obj){int val = obj.Value() + 10;Object obja(val);return obja;}int main(){Object objx(0);Object objy(0);objy = fun(objx);cout << objy.Value() << endl;return 0;}我们在这⾥希望通过引⽤返回,这⾥return的临时对象会构建在fun函数的栈帧中,并且在函数结束栈帧释放,随后调⽤赋值运算符重载,但是数值依旧是正确的我们跟踪这个被析构对象的地址,⾸先我们定位在fun函数的return obja;,随后进⼊析构函数将我们的obja进⾏析构接着运⾏到回到主函数进⾏赋值,接着进⼊赋值运算符重载,可以看到,这⾥的obj地址与已被析构的obja地址相同可以看到这个值依旧存在,依旧可以打印给出,这是因为vs2019的特殊性质造成的;我们每次运⾏程序会发现每次的对象地址都在变化,逻辑地址会随机改变,被析构对象的栈帧不会被接下来的赋值运算符重载扰乱地址空间,所以即使我们引⽤返回的对象已经死亡依旧可以将数值正确返回但是在vc中,我们得到的值会是随机值,这是因为vc中每次运⾏程序地址都不会改变,当我们从fun函数退出进⼊赋值语句中,就会将原本存储数据的地址扰乱,继⽽变成了随机值尽管我们引⽤返回能够将数据正确打印,但是该对象已经死亡,这是不安全的,所以我们⼀定不要以引⽤返回对象VS2019具有⼀个特点:当我们调⽤函数,若函数中没有定义局部变量或局部对象时,该函数基本不对栈帧进⾏清扫总结到此这篇关于C语⾔运算符的重载详解的⽂章就介绍到这了,更多相关C语⾔运算符重载内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

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/C++语言中一种强大的功能,允许程序员自定义函数的行为,以处理不同类型的数据。

运算符重载允许程序员在函数中重载算术、逻辑和位运算符,从而能够处理数组、结构体和指针等不同类型的数据。

以下是运算符重载的规则:1. 算术运算符重载算术运算符包括加号、减号、乘号和除号。

每个算术运算符都有一组默认的行为,可以通过运算符重载来自定义它们的行为。

例如,重载加号运算符可以使函数接受一个整数参数,并返回一个新的整数。

下面是一个简单的例子,演示了如何重载加号运算符:```c++struct MyStruct {int value;};MyStruct operator+(const MyStruct& other, int value) {return MyStruct(value + other.value);}int main() {MyStruct mystruct1 = { 10 };MyStruct mystruct2 = { 20 };int result = mystruct1 + mystruct2;std::cout << "result = " << result << std::endl;return 0;}```在上面的例子中,我们定义了一个名为`MyStruct`的结构体类型,其中包含一个整数类型。

然后,我们定义了一个重载加号运算符的函数,该函数接受一个整数类型的参数,并返回一个新的`MyStruct`对象。

在`main`函数中,我们定义了两个`MyStruct`对象`mystruct1`和`mystruct2`,并将它们相加,结果存储在`result`变量中。

2. 逻辑运算符重载逻辑运算符包括条件运算符和逻辑非运算符。

每个逻辑运算符都有一组默认的行为,可以通过运算符重载来自定义它们的行为。

C--程序设计运算符重载资料

C--程序设计运算符重载资料
• 三目运算符有三个操作数参与运算,三目运算符只包 括问号运算符,行例如z?x:y
• 不确定目数运算符是操作数个数不确定,可依据需要 重载为不同的操作数个数,不确定目数运算符只包括 函数调用运算符“〔〕”
• 在C++中只能重载单目运算符、双目运算符及不确定
4.2.1 运算符重载为类的成员函数
• 通过该类的对象来调用运算符函数,由于对象本身将作为一 个操作数,因此要求第一个操作数的类型为用户自定义类, 参数表中的参数个数比操作数个数少一。
2+3i
6-5i
8-2i
请按任意键连续. . .
运算符重载
• 能否像实数的加法运算一样,直接用加号“+”来实 现复数运算呢?例如在程序中直接用“z3=z1+z2”进 展运算,这需要对运算符“+”进展重载。
• 运算符重载的方法在实质上就是定义一个重载运算符 的函数,在执行被重载的运算符时,系统将调用此函 数实现相应的运算。运算符重载本质就是函数的重载。
else if (image == 0) cout << real << endl;
// 虚部为0
else cout << real << “+” << image << “i” << endl; // 虚部为负
}
……
例4.1 通过函数实现复数相加例如。
……
Complex Complex::Add(const Complex &z1,const Complex &z2)
• 单目运算符的运算符在一般状况下重载为类的成员函数时,形参表为 • 空,以当前对象〔即调用该运算符函数的对象〕作为运算符唯一的操 • 作数。

C++程序设计04737 第4章 运算符重载

C++程序设计04737 第4章 运算符重载

~myComplex(){ }
myComplex addCom(myComplex c1);//成员函数,调用对象与参数对象c1相加
void outCom();
//成员函数
void outCom(string s); //成员函数
void changeReal(double r);//成员函数
friend myComplex operator+(const myComplex &c1,const myComplex &c2); //c1+c2
4.1 运算符重载的概念
例4-2 重载为友元函数
#include <iostream>
using namespace std;
class myComplex
{private: double real,imag;
public:
myComplex();
myComplex(double r,double i);
class myComplex
//复数类
{
private: double real,imag;
public: myComplex();
//构造函数
myComplex(double r,double i);
//构造函数
void outCom();
//成员函数
myComplex operator-(const myComplex &c);//成员函数
4.1 运算符重载的概念
三、重载运算符为友元函数
例4-1 重载为成员函数的限制
1. #include <iostream>
2. using namespace std;

c 重载运算符

c 重载运算符

c 重载运算符C++中的重载运算符是一种非常有用的功能,可以让开发者自定义类的行为,使其更符合自己的需求。

重载运算符可以让类对象像基本类型一样进行运算,比如加、减、乘、除等。

这些运算符重载函数在类中被定义,它们使用特殊的语法来表示运算符的操作。

在C++中,有些运算符必须要被重载,比如等于、不等于、小于等等。

其他的运算符可以根据需求进行重载。

重载运算符的参数和返回值可以是任意类型,但是它们的语法必须要遵循一定的规则。

重载运算符的函数名以'operator'开头,后面跟着要重载的运算符,比如'operator+'表示重载加运算符。

重载运算符函数可以是类的成员函数,也可以是全局函数。

需要注意的是,重载运算符函数必须至少有一个参数,但是几乎所有的运算符都只需要一个参数。

举个例子,如果我们要重载'+'运算符,我们可以在类中定义如下函数:class MyClass {public:MyClass operator+(const MyClass& other) {//重载'+'运算符}};这个函数将两个MyClass对象相加并返回一个新的MyClass对象。

这样我们就可以像下面这样使用加法运算符:MyClass a, b, c;c = a + b;除了基本运算符,我们还可以重载一些其他的运算符,比如()、[]、->等等。

重载这些运算符可以让我们自定义对象的操作,使得代码更加简洁易懂。

总之,重载运算符是C++中非常有用的一个功能,可以让我们自定义对象的行为,使得代码更加灵活、可读性更高。

需要注意的是,重载运算符函数必须遵循一定的规则,才能正确地使用。

c++(8)-运算符重载(提高)-括号运算符重载

c++(8)-运算符重载(提高)-括号运算符重载

c++(8)-运算符重载(提⾼)-括号运算符重载1.括号运算符重载1.1 现象如果在调⽤时候遇到下⾯的写法,可能会出现两种情况,⼀种是函数的调⽤,⼀种是“()”括号运算符的重载;1.2 括号运算符重载【函数调⽤与运算符重载】2.为什么不要重载 && 和|| 操作符?【原因】1.&& 和|| 是 C++中⾮常特殊的操作符,&& 和|| 内置实现了短路规则;如果使⽤了c++的重载“&& 和|| ”⽆法使实现短路规则;1 #include <cstdlib>2 #include <iostream>3using namespace std;4class Test5 {6int i;78public:9 Test(int i)10 {11this->i = i;12 }13 Test operator+(const Test &obj)14 {15 Test ret(0);16 cout << " 执⾏ +号重载函数 " << endl;17 ret.i = i + obj.i;18return ret;19 }20bool operator&&(const Test &obj)21 {22 cout << " 执⾏ &&重载函数 " << endl;23return i && obj.i;24 }25 };26// && 从左向右27void main()28 {29int a1 = 0;30int a2 = 1;31 cout << "注意: &&操作符的结合顺序是从左向右 " << endl;32if (a1 && (a1 + a2))33 {34 cout << " 有⼀个是假,则不在执⾏下⼀个表达式的计算 " << endl;35 }36 Test t1 = 0;37 Test t2 = 1;38 If(t1 && (t1 + t2))39 {40//t1&& t1.operator(t2)41// t1.operator( t1.operator(t2) )42 cout << " 两个函数都被执⾏了,⽽且是先执⾏了 +" << endl;43 }44 system("pause");45return;46 }【说明】需要与“运算符的结合性”区别开;。

c语言 重载 赋值运算符

c语言 重载 赋值运算符

c语言重载赋值运算符【原创版】目录1.概述 C 语言中的运算符重载2.赋值运算符重载的规则和注意事项3.示例:实现一个简单的赋值运算符重载正文一、概述 C 语言中的运算符重载C 语言是一种广泛应用的编程语言,其功能丰富,可以实现各种复杂的操作。

在 C 语言中,运算符重载是一种重要的语言特性,它允许程序员根据需要自定义运算符的行为。

运算符重载可以让代码更加简洁,提高程序的可读性。

在 C 语言中,赋值运算符重载是最常用的一种运算符重载方式。

二、赋值运算符重载的规则和注意事项赋值运算符重载是指对 C 语言中的赋值运算符“=”进行重载,以实现特定的功能。

在实现赋值运算符重载时,需要遵循以下规则:1.运算符重载函数必须有一个参数,即要赋值的对象。

2.运算符重载函数不能有返回值。

赋值运算符的功能是将右侧表达式的值赋给左侧的对象,因此不能有返回值。

3.运算符重载函数的函数名以“operator”开头,后跟赋值运算符“=”。

例如,实现一个整数类型的赋值运算符重载,函数名应为“operator=”。

4.在运算符重载函数中,不能修改左侧的对象。

只能通过拷贝构造函数或赋值运算符来修改对象的值。

5.运算符重载函数的参数类型必须与左侧对象的类型匹配。

三、示例:实现一个简单的赋值运算符重载下面是一个简单的示例,实现了一个整数类型的赋值运算符重载。

在这个示例中,我们定义了一个名为“Int”的整数类,并在其中实现了赋值运算符重载。

```c#include <iostream>using namespace std;class Int {public:// 构造函数Int(int value) {this->value = value;}// 拷贝构造函数Int(const Int& other) {this->value = other.value;}// 重载赋值运算符void operator=(const Int& other) {if (this == &other) {return; // 禁止自我赋值}this->value = other.value;}// 打印函数void print() {cout << "Value: " << value << endl;}private:int value;};int main() {Int a, b;a = 10;b = a;b = 20;a.print(); // 输出:Value: 20return 0;}```在这个示例中,我们定义了一个名为“Int”的整数类,并在其中实现了赋值运算符重载。

C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

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++运算符重载(简单易懂)

C++运算符重载(简单易懂)

C++运算符重载(简单易懂)运算符重载,就是对已有的运算符重新进⾏定义,赋予其另⼀种功能,以适应不同的数据类型。

你可以重定义或重载⼤部分 C++ 内置的运算符。

例如 + 、 - 、 * 、 / 、++、--、>>、<<等,这样,你就能使⽤⾃定义类型的运算符。

运算符重载的基本格式重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。

与其他函数⼀样,重载运算符有⼀个返回类型和⼀个参数列表。

Point operator+(const Point &);运算符重载有两种⽅式:⼀种是类内重载(运算符重载函数作为类的成员函数),另⼀种是类外重载(运算符重载函数作为类的友元函数)类内重载#include <iostream>using namespace std;class Point{public:Point(){};Point (int x, int y): x(x),y(y) {};Point operator+(const Point &a){ //类内重载,运算符重载函数作为类的成员函数Point ret;ret.x = this->x + a.x;ret.y = this->y + a.y;return ret;}int x,y;};int main() {Point a(2,4),b(5,3);Point c = a + b;cout<< "x :" << c.x << endl;cout<<"y :" << c.y << endl;}当上⾯的代码被编译和执⾏时,它会产⽣下列结果:x : 7y: 7运算符重载是类内重载时,运算符重载函数作为类的成员函数,以上述代码为例 a + b 相当于 a 对象调⽤+⽅法并且传⼊参数时 b 对象类外重载#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);cout<< "x :" << c.x << endl;cout<<"y :" << c.y << endl;}当上⾯的代码被编译和执⾏时,它会产⽣和上⾯⼀样的结果各种运算符重载实例下⾯将进⾏各种运算符重载实例的代码演⽰,演⽰⼏种基本的运算符重载。

C++运算符重载知识点总结

C++运算符重载知识点总结

C++运算符重载知识点总结C++运算符重载知识总结5.1编译时的多态性与运⾏时的多态性在C++中,多态性的实现和联编(也叫绑定)这⼀概念有关。

源程序—>编译、连接—>可执⾏⽂件这⼀过程时把可执⾏代码联编在⼀起的过程。

其中在运⾏之前就完成的联编叫做静态联编,⼜叫前期联编;⽽在程序运⾏时才完成的联编叫动态联编,也叫后期联编。

静态联编(前期联编):指系统在编译时就决定如何实现某⼀动作。

要求在编译时就知道调⽤函数的全部信息。

静态联编⽀持的多态性成为编译时多态性(静态多态性),通过函数重载(包括运算符重载)和模板实现。

优点:函数调⽤速度很快,效率⾼。

动态联编(后期联编):指系统在运⾏时动态实现某⼀动作。

采⽤这种联编⽅式,⼀直要到程序运⾏时才能确定调⽤哪个函数。

动态联编⽀持的多态性成为运⾏时多态性(动态多态性),通过虚函数实现。

优点:提供了更好的灵活性、问题抽象性和程序易维护性。

5.2运算符重载5.2.1在类外定义的运算符重载函数为了表达上的⽅便,⼈们希望预定义的运算符(如+、-、*、/等)在特定的对象上以新的含义进⾏解释,如希望能够实现两个复数类的加减,这就需要通过运算符重载来解决。

C++中进⾏运算符重载时,必须定义⼀个运算符重载函数,其名字为operator,后随⼀个要重载的运算符。

#includeusing namespace std;class Complex{public:double real;double imag;Complex(double r=0,double i=0){real=r;imag=i;}};Complex operator+(Complex co1,Complex co2)//类外定义运算符+的重载函数{Complex temp;temp.real=co1.real+co2.real;temp.imag=co1.imag+co2.imag;return temp;}int main(){Complex com1(1.1,2.2),com2(3.3,4.4),total1,total2;total1=operator+(com1,com2);//运算符重载函数第⼀种调⽤⽅式,显式调⽤cout<<"real1="<total2=com1+com2;//运算符重载函数第⼆种调⽤⽅式,隐式调⽤cout<<"real2="<return0;}C++语⾔对运算符重载制定了以下⼀些规则:1.绝⼤部分运算符可以重载,不能重载的只有以下⼏个:2.3.运算符重载是针对新类型数据的实际需要,不建议改变原运算符的含义。

简述运算符重载的规则。

简述运算符重载的规则。

简述运算符重载的规则。

运算符重载是C语言中的一种语法特性,允许程序员在函数内部重载运算符,以改变其操作类型和参数类型。

运算符重载可以用于实现一些复杂的逻辑,也可以用于提高代码的灵活性和可重用性。

运算符重载的规则如下:
1. 运算符重载只能重载算术运算符和逻辑运算符,不能重载关系运算符(如+、-、*、/等)。

2. 运算符重载的重载点必须在函数内部,不能跨越函数调用。

3. 运算符重载的参数类型必须与运算符的类型相同或相似,且参数类型之间的运算符必须兼容。

4. 运算符重载的函数必须声明在头文件中,并且必须在文件定义之前声明。

5. 运算符重载的函数可以重载多个运算符,但是不能重复重载同一个运算符。

6. 运算符重载的函数可以修改原始运算符的行为,比如将一个算术运算符重载为逻辑运算符。

7. 运算符重载的函数可以改变运算符的顺序,比如将一个逻辑运算符重载为算术运算符。

8. 运算符重载的函数可以改变运算符的优先级,比如将一个逻辑运算符重载为算术运算符或者赋值运算符。

通过运算符重载,程序员可以实现一些复杂的逻辑,比如将一个算术运算符重载为逻辑运算符,以进行条件判断和流程控制。

运算符重载还可以提高代码的
灵活性和可重用性,因为不同的函数可以分别实现不同的逻辑,而不必共享相同的代码。

除了常见的算术运算符重载和逻辑运算符重载外,C语言还支持一些其他的运算符重载,比如字符串比较运算符重载、字符串拼接运算符重载等。

程序员可以根据具体的需求和场景,灵活地使用运算符重载来实现不同的逻辑。

c程序设计课件第7章运算符重载

c程序设计课件第7章运算符重载
类型的操作数上面。
2
class Money
{public: Money(int y = 0, int j = 0, int f = 0)
构造函数
{ yuan = y; jiao = j; fen = f; optimize( ); }
void Display(string);
private:
Money cost1(10, 3, 5);
if ( jiao >= 10 ){ yuan++; jiao -=10; } }
void Money::Display(string str)
{ cout << str << " = " << yuan << "." << jiao << fen << "¥" <<
endl; } 3
class Money {public: Money(int y = 0, int j = 0, int f = 0) { yuan = y; jiao = j; fen = f; optimize( ); } void Display(string);
调用:total1 = cost1 + cost2; 形参的顺序任意,不要求第一个参数必须为类对象。要
求运算符左侧的操作数与第一个参数对应,运算符右侧
的操作数与第二个参数对应。
13
7.3 重载运算符的规则
❖(1)C++不允许用户自己定义新的运算符,只 能对C++语言中已有的运算符进行重载。例如 ,虽然在某些程序设计语言中用双字符“**” 作为求幂运算符,但是在使用C++进行程序设 计时,不能将“**”作为运算符进行重载,因 为“**”不是C++语言的合法运算符。

C++学习之运算符重载的总结

C++学习之运算符重载的总结

C++学习之运算符重载的总结C++学习之运算符重载的总结运算符重载是对已有的运算符赋予多重含义,使同⼀个运算符作⽤域不同类型的数据导致不同⾏为的发⽣,C++为运算符重载提供了⼀种⽅法,即运算符重载函数。

其函数名字规定为operator后紧跟重载运算符。

⽐如:operator+(),operator*()等。

(1)运算符重载函数作为类的友元函数的形式: class 类名 { friend 返回类型 operator运算符(形参表); } 类外定义格式: 返回类型 operator运算符(参数表) { 函数体 }友元函数重载双⽬运算符(有两个操作数,通常在运算符的左右两则),参数表中的个数为两个。

若是重载单⽬运算符(只有⼀个操作数),则参数表中只有⼀参数。

同⼀个运算符可以定义多个运算符重载函数来进⾏不同的操作。

(2)运算符重载函数作为类的成员函数的形式: class 类名 { 返回类型 operator 运算符(形参表); } 类外定义格式: 返回类型类名:: operator 运算符(形参表) { 函数体; }对于成员函数重载运算符⽽⾔,双⽬运算符的参数表中仅有⼀个参数,⽽单⽬则⽆参数。

同样的是重载,为什么和友元函数在参数的个数上会有所区别的。

原因在于友元函数,没有this指针。

对于双⽬运算符⽽⾔,运算符重载函数的形参中仅为⼀个参数,它作为运算符的右操作数(如com2对象),⽽当前对象作为左操作数(如:上述中的com1对象),它是通过this指针隐含传递给成员运算符重载函数的。

例如下⾯这样的定义:Complex operator+(Complex com1);//成员函数重载双⽬运算符+20Complex Complex::operator+(Complexcom1)21{22return Complex(real+com1.real,imag+com1.imag);23}对于单⽬运算符⽽⾔,当前对象作为运算符的操作数。

C程序设计运算符重载资料

C程序设计运算符重载资料


{
目的对象与源对象不是同一个对象

……
复制被被赋值对象

}

*;
返回目的对象
•}
*重载赋值运算符“=”
• 如用户没有为一个类重载赋值运算符,编译程序将生成一个默认赋值运算符函数。赋值运算 把源对象的数据成员逐个地复制到目的对象的相应数据成员
0;
返回值0, 返回操作系统
}
程序运行时屏幕输出如下: 6 -6 请按任意键继续. . .
用类的友元函数重载双目运算符
• 将双目运算符重载为类的友元函数时,友元函数形参表中包含有两个参数,这两个参数分别 作为运算符的左、右操作数。
例4.6 双目运算符重载为类的友元函数示例。
<>
编译预处理命令
;
使用命名空间
例4.8 双目运算符重载为普通函数示例。 声明整型类
{
:
数据成员
;
数据值
:
公有函数
( n = 0): (n){ }
构造函数
( n) { = n; }
设置数据值
() { ; } 返回数据值
};
( , ) 重载运算符"+"
{ (() + ()); }
()
主函数()
{
i(6), j(9), k;
定义整型对象
例4.5 单目运算符重载为类的友元函数示例。
<>
编译预处理命令
;
使用命名空间
声明整型类
{
: 数据成员
在 6.0下会出现的编译时错语,是 6.0的一个,在
<> ;;
编译预处理:
:
改为:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、运算符重载的规则运算符重载规则如下:①、C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。

②、重载之后运算符的优先级和结合性都不会改变。

③、运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。

一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。

不能重载的运算符只有五个,它们是:成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”。

运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。

运算符重载为类的成员函数的一般语法形式为:函数类型 operator 运算符(形参表){函数体;}运算符重载为类的友元函数的一般语法形式为:friend 函数类型 operator 运算符(形参表){函数体;}其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。

当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。

原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。

而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。

运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式,以适应用户自定义类型的类似运算。

一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便此,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。

二、运算符重载为成员函数对于双目运算符B,如果要重载B为类的成员函数,使之能够实现表达式oprd1 B oprd2,其中oprd1为类A的对象,则应当把B重载为A类的成员函数,该函数只有一个形参,形参的类型是oprd2所属的类型。

经过重载后,表达式oprd1 B oprd2 就相当于函数调用oprd1.operator B(oprd2).对于前置单目运算符U,如“-”(负号)等,如果要重载U为类的成员函数,用来实现表达式U oprd,其中oprd为A类的对象,则U应当重载为A类的成员函数,函数没有形参。

经过重载之后,表达式U oprd相当于函数调用oprd.operator U().对于后置运算符“++”和“- -”,如果要将它们重载为类的成员函数,用来实现表达式oprd++或oprd--,其中oprd为A类的对象,那么运算符就应当重载为A类的成员函数,这时函数要带有一个整型形参。

重载之后,表达式oprd++和oprd—就想当于函数调用oprd.operator++(0)和oprd.operator—(0);运算符重载就是赋予已有的运算符多重含义。

通过重新定义运算符,使它能够用于特定类的对象执行特定的功能,这便增强了C++语言的扩充能力。

1. 运算符重载的作用:运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。

重载的运算符是函数调用的语法修饰:class Fred{public:// ...};#if 0// 没有算符重载:Fred add(Fred, Fred);Fred mul(Fred, Fred);Fred f(Fred a, Fred b, Fred c){return add(add(mul(a,b), mul(b,c)), mul(c,a)); // 哈哈,多可笑...}#else// 有算符重载:Fred operator+ (Fred, Fred);Fred operator* (Fred, Fred);Fred f(Fred a, Fred b, Fred c){return a*b + b*c + c*a;}#endif2. 可以用作重载的运算符:算术运算符:+,-,*,/,%,++,--;位操作运算符:&,|,~,^,<<,>>逻辑运算符:!,&&,||;比较运算符:<,>,>=,<=,==,!=;赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。

下列运算符不允许重载:.,.*,::,?:3. 运算符重载后,优先级和结合性:用户重载新定义运算符,不改变原运算符的优先级和结合性。

这就是说,对运算符重载不改变运算符的优先级和结合性,并且运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载双目运算符。

4. 编译程序如何选用哪一个运算符函数:运算符重载实际是一个函数,所以运算符的重载实际上是函数的重载。

编译程序对运算符重载的选择,遵循着函数重载的选择原则。

当遇到不很明显的运算时,编译程序将去寻找参数相匹配的运算符函数。

5. 重载运算符有哪些限制:(1) 不可臆造新的运算符。

必须把重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中。

(2) 重载运算符坚持4个“不能改变”。

·不能改变运算符操作数的个数;·不能改变运算符原有的优先级;·不能改变运算符原有的结合性;·不能改变运算符原有的语法结构。

6. 运算符重载时必须遵循哪些原则:运算符重载可以使程序更加简洁,使表达式更加直观,增加可读性。

但是,运算符重载使用不宜过多,否则会带来一定的麻烦。

(1) 重载运算符含义必须清楚。

(2) 重载运算符不能有二义性。

运算符重载函数的两种形式运算符重载的函数一般地采用如下两种形式:成员函数形式和友元函数形式。

这两种形式都可访问类中的私有成员。

1. 重载为类的成员函数这里先举一个关于给复数运算重载复数的四则运算符的例子。

复数由实部和虚部构造,可以定义一个复数类,然后再在类中重载复数四则运算的运算符。

先看以下源代码:#include <iostream.h>class complex{public:complex() { real=imag=0; }complex(double r, double i){real = r, imag = i;}complex operator +(const complex &c);complex operator -(const complex &c);complex operator *(const complex &c);complex operator /(const complex &c);friend void print(const complex &c);private:double real, imag;};inline complex complex::operator +(const complex &c){return complex(real + c.real, imag + c.imag);}inline complex complex::operator -(const complex &c){return complex(real - c.real, imag - c.imag);}inline complex complex::operator *(const complex &c){return complex(real * c.real - imag * c.imag, real * c.imag + imag * c.real);}inline complex complex::operator /(const complex &c){return complex((real * c.real + imag + c.imag) / (c.real * c.real + c.imag * c.imag), (imag * c.real - real * c.imag) / (c.real * c.real + c.imag * c.imag));}void print(const complex &c){if(c.imag<0)cout<<c.real<<c.imag<<'i';elsecout<<c.real<<'+'<<c.imag<<'i';}void main(){complex c1(2.0, 3.0), c2(4.0, -2.0), c3;c3 = c1 + c2;cout<<"\nc1+c2=";print(c3);c3 = c1 - c2;cout<<"\nc1-c2=";print(c3);c3 = c1 * c2;cout<<"\nc1*c2=";print(c3);c3 = c1 / c2;cout<<"\nc1/c2=";print(c3);c3 = (c1+c2) * (c1-c2) * c2/c1;cout<<"\n(c1+c2)*(c1-c2)*c2/c1=";print(c3);cout<<endl;}该程序的运行结果为:c1+c2=6+1ic1-c2=-2+5ic1*c2=14+8ic1/c2=0.45+0.8i(c1+c2)*(c1-c2)*c2/c1=9.61538+25.2308i在程序中,类complex定义了4个成员函数作为运算符重载函数。

将运算符重载函数说明为类的成员函数格式如下:<类名>operator <运算符>(<参数表>)其中,operator是定义运算符重载函数的关键字。

程序中出现的表达式:c1+c2编译程序将给解释为:c1.operator+(c2)其中,c1和c2是complex类的对象。

operator+()是运算+的重载函数。

该运算符重载函数仅有一个参数c2。

可见,当重载为成员函数时,双目运算符仅有一个参数。

对单目运算符,重载为成员函数时,不能再显式说明参数。

重载为成员函数时,总时隐含了一个参数,该参数是this指针。

this指针是指向调用该成员函数对象的指针。

2. 重载为友元函数:运算符重载函数还可以为友元函数。

当重载友元函数时,将没有隐含的参数this指针。

这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。

相关文档
最新文档