c++ 运算符重载的写法

合集下载

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

C程序设计运算符重载资料
• 不确定目数运算符是操作数个数不确定,可根据需要 重载为不同的操作数个数,不确定目数运算符只包括 函数调用运算符“()”
• 在中只能重载单目运算符、双目运算符及不确定目数 运算符“()”
4.2.1 运算符重载为类的成员函数
• 通过该类的对象来调用运算符函数,由于对象本身将作为一 个操作数,因此要求第一个操作数的类型为用户自ቤተ መጻሕፍቲ ባይዱ义类, 参数表中的参数个数比操作数个数少一。
• 运算符重载的方法在实质上就是定义一个重载运算符 的函数,在执行被重载的运算符时,系统将调用此函 数实现相应的运算。运算符重载本质就是函数的重载。
• 重载运算符的函数的原型如下:
• 返回值类型运算符(形参表);
• 例如将“+”用于类的加法运算运算符重载的函数原 型可以为:
• ( 1, 2);
例4.2 通过运算符重载实现复数相加的示例。
例4.1 通过函数实现复数相加示例。 声明复数数
{
:
数据成员
;
实部
;
虚部
:
公有函数
( r = 0, i = 0): (r), (i){ } 构造函数
() ;
输出复数
( 1, 2);
复数加法
};
()
输出复数
{
( < 0) << << << "i" << ;
虚部为负
( 0) << << ;
虚部为0
<< << “+” << << “i” << ;
z1();
象的过程中调用输了出构z1造函数,语句将此临时对象作为函

总结运算符重载的形式。

总结运算符重载的形式。

总结运算符重载的形式。

运算符重载是C++中的一个重要特性,它允许程序员自定义数据类型的运算符行为。

通过运算符重载,程序员可以有更多的灵活性和简洁性来表达对自定义数据类型的操作。

运算符重载需要特定的形式来定义重载函数,下面是一些常见的形式:1. 非成员函数形式:```返回类型 operator 运算符(参数列表){//重载函数体}```这种形式中,运算符重载函数是一个普通的非成员函数,通过参数列表中的参数来传递操作数。

在函数体中,程序员需要手动实现操作符的具体行为。

2. 成员函数形式:```class MyType{public:返回类型 operator 运算符(参数列表){//重载函数体}};```这种形式中,运算符重载函数是一个MyType类的成员函数。

和非成员函数一样,通过参数列表中的this指针传递操作数,但此时操作数是MyType类对象的一个成员,成员函数中可以访问该成员函数的私有数据和成员函数。

3. 可转换成成员函数形式:```class MyType{public:返回类型 operator 运算符(参数列表) const{ //重载函数体}};```这种形式中,运算符重载函数是一个MyType类的成员函数,但是在函数后面添加了const,表示该重载函数不会修改MyType类对象。

在函数体内部,可以访问MyType类的成员变量,但是不能修改。

运算符重载是C++中强大特性之一,通过自定义数据类型的运算符行为,我们可以方便地对数据类型进行操作。

程序员在使用运算符重载时一定要注意运算符重载的形式,以确保正确使用。

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++中,重载运算符的一般格式为:cpp复制代码
返回类型operator@(参数表) {
重载函数体;
}
对于重载运算符的顺序,C++并没有规定特定的顺序。

你可以根据需要,按照你的编程逻辑和设计要求,来决定先重载哪个运算符,后重载哪个运算符。

然而,有一些规则是需要注意的:
1.不允许定义新的运算符。

2.不能改变该运算符操作数(对象)的个数。

3.不能改变该运算符的优先级别和结合性。

4.应该符合实际需要,重载的功能应该与运算符原有的功能相似,避免没有目的的使用重载运算符。

此外,运算符重载可以是成员函数,也可以是友元函数。

如果运算符重载为友元函数,需要在相应的类中声明为该类的友元函数。

因此,重载运算符的顺序并没有固定的规则,而是由编程者的设计需求和编程逻辑决定的。

同时,还需要注意遵守上述的运算符重载规则。

运算符重载模板写法

运算符重载模板写法

运算符重载模板写法运算符重载写为成员函数还是全局函数的格式,取决于你所要达到的⽬的。

重载为成员函数,那么该运算符的左边必须是某个类的对象实例。

重载为全局函数,可以⾃定义该运算符的左边是什么东西,右边是什么东西。

左边接受范围是第⼀个参数类型,右边接受范围是第⼆个参数类型。

运算符重载的注意点:⼀些常见的运算符重载模板:#include <iostream>using namespace std;class Point {int x;int y;public:Point(int x1 = 0, int y1 = 0) :x(x1), y(y1) {}Point(const Point& p) :x(p.x), y(p.y) {}// 输⼊输出运算符重载friend ostream& operator<<(ostream& output, const Point& p);friend istream& operator>>(istream& input, Point& p);// 第⼀个const保证了返回值不可被再次修改// 第三个const保证了const变量也能调⽤该操作符,也可保证成员变量不被修改const Point operator+ (const Point &p) const {return Point(x + p.x, y + p.y);}const Point operator- (const Point& p) const {return Point(x - p.x, y - p.y);}Point& operator+= (const Point& p) {x += p.x;y += p.y;return *this;}// 逻辑运算符bool operator== (const Point& p) const {return (x == p.x) && (y == p.y);}bool operator!= (const Point& p) {return (x != p.x) || (y != p.y);}// 负号,取反运算符const Point operator-() const {return Point(-x, -y);}//前置++Point& operator++() {x++;y++;return *this;}//后置++(括号内的int不可省略,不可更改)const Point operator++(int) {Point old = *this;x++;y++;return old;}void info() {cout << "(" << x << "," << y << ")" << endl;}};ostream& operator<<(ostream& output, const Point& p) { output << "(" << p.x << "," << p.y << ")";return output;}istream& operator>>(istream& input, Point& p) {input >> p.x >> p.y;return input;}int main() {Point p1(10, 20);Point p2(20, 30);Point p3;cout << p1 << endl;cin >> p3;cout << p3 << endl;return0;}。

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重载输入与输出操作符_C教程

C++重载输入与输出操作符_Java教程C++重载输入与输出操作符在C++中,系统已经对左移操作符“<<”和右移操作符“>>”分别进行了重载,使其能够用作输入输出操作符,但是输入输出的处理对象只是系统内建的数据类型。

系统重载这两个操作符是以系统类成员函数的形式进行的,因此cout<< var语句可以理解为:cout.operator<<( var )如果我们自己定义了一种新的数据类型,需要用输入输出操作符去处理,则需要重载这两个操作符。

在前面我们已经定义了complex类,如果我们需要直接输入输出复数的话我们可以对这两个操作符进行重载。

下面将以complex为例说明重载输入输出操作符的方法。

我们可以重载输入操作符,使之读入两个double类型数据,并且将之转换为一个复数,并存入到一个复数类对象中。

我们采用顶层函数的形式来实现输入操作符的重载。

istream & operator>>(istream & in, complex & A){in >> A.real >> A.imag;return in;}在上面函数中istream是指输入流,这个将会在后面讲到。

因为重载操作符函数需要用到complex类的私有成员变量,为了方便,我们将这个函数声明为complex类的友元函数。

其声明形式如下:friend istream & operator>>(istream & in , complex & a);该函数可以按照如下方式使用:complex c;cin>> c;有了这两个语句后,我们输入(↙表示用户按下enter键)1.452.34↙之后这两个数据就分别成立复数类对象c的实部和虚部了。

“cin>> c;”这一语句其实可以理解为:operator<<(cin , c);在重载输入操作符时,我们采用的是引用的方式进行传递参数的,输入的参数里面包含一个istream流的引用,返回值仍然为该引用,因此我们仍然可以使用输入操作符的链式输入。

C++中运算符重载的规则语法实例

C++中运算符重载的规则语法实例

C++中运算符重载的规则语法实例运算符重载,就是对已有的运算符重新进⾏定义,赋予其另⼀种功能,以适应不同的数据类型。

之前就知道运算符的重载就是将它重新定义,给它新的功能,为的式符合程序员的要求,⼀个例⼦就是,要将坐标相加,但是电脑不知道怎么相加,于是聪明的⼈就赋予了“+”新的定义。

然⽽⼀些严格意义上的⽤法还不是很清楚。

现在就在这总结⼀下。

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

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

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

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

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

运算符重载为类的成员函数的⼀般语法形式为:函数类型 operator 运算符(形参表){函数体;}⼲脆将⼀些运算符重新列出下⼀下:可以⽤作重载的运算符:算术运算符:+,-,*,/,%,++,--;位操作运算符:&,|,~,^,<<,>>逻辑运算符:!,&&,||;⽐较运算符:<,>,>=,<=,==,!=;赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*下列运算符不允许重载:.,.*,::,?:(上⾯也说了的)下⾯给例⼦Boxoperator+(const Box&, const Box&);声明加法运算符⽤于把两个 Box 对象相加,返回最终的 Box 对象。

⼤多数的重载运算符可被定义为普通的⾮成员函数或者被定义为类成员函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c++ 运算符重载的写法
在C++中,运算符重载允许我们重新定义已有的运算符,使其适用于自定义的数据类型。

这样可以使得我们的自定义类型具有与内置类型相似的行为。

运算符重载的写法如下:
1. 成员函数形式:
返回类型 operator运算符(参数列表) {。

// 实现运算符重载的逻辑。

}。

这里的operator运算符是要重载的运算符,参数列表是运算符操作的参数。

返回类型是运算符操作的结果类型。

2. 友元函数形式:
friend 返回类型 operator运算符(参数列表) {。

// 实现运算符重载的逻辑。

}。

在这种形式下,operator关键字后面紧跟要重载的运算符,然后是参数列表和实现运算符重载的逻辑。

需要注意的是,不是所有的运算符都可以被重载,也不是所有
的运算符都可以以成员函数的形式进行重载。

例如,赋值运算符`=`, 成员访问运算符`->`和作用域解析运算符`::`不能被重载。

此外,在进行运算符重载时,需要注意避免对运算符的本质含
义进行过度改变,以免造成混淆。

另外,为了避免歧义,建议仅重
载已有含义的运算符,不要创建新的运算符。

最后,在实现运算符
重载时,需要考虑重载后的运算符操作是否符合常规的语义,以及
是否符合预期的行为。

总之,C++中的运算符重载为我们提供了一种非常灵活的方式,
可以使得自定义类型具有与内置类型相似的行为,但是在使用时需
要谨慎考虑,避免造成混淆和歧义。

相关文档
最新文档