重载运算符问题

关于运算符重载:

不允许用户自定义新的运算符,只能对已有的运算符进行重载

重载运算符不允许改变运算符原操作数的个数

重载运算符不能改变运算符的优先级

重载运算符函数不能有默认的参数,会导致参数个数不匹配

可以在类内实现,作为类的成员函数,也可定义为类的友元函数

当运算符重载函数作为类的成员函数时,要求操作数左边必须是一个对象,而函数的参数可以是同类的对象也可以是普通的变量。

//作为类成员函数定义:
Complex operator+(Complex &c1){
    return new Complex(this.real+c1.real,this.image+c1.image);
}

//调用:
(1)c3 = c1+c2;  即 c3 = c1.operator+(c2)  //正确
(2)c3 = c1+5;  函数原型:Complex operator+(int i){}  //正确
(3)c3 = 5+c1;  //错误

这是因为没有办法调用i.operator+(c1)。那么如果想要这么做,只能作为类的非成员函数,而且当要访问的数据为对象的私有成员函数时,则必须声明为类的友元函数。

总结来说:(1)类的成员函数实现运算符重载,必须保证左操作数已经处于正确的形式。

(2)全局版本的自动类型(友元)转换可以针对左右任意操作数。

(3)各自的优势:成员函数保证了封装性,就是指非自身成员不能访问私有成员,而友元属于非自身成员,但是赋予他特权来访问类的私有成员,可以理解为破坏类的封闭性。但是友元函数实现比较灵活。

所以对于运算符重载,有必须定义为成员函数的,比如[],->,(),=这四个运算符必须基于对象才能用,也有的既可以作为类的成员函数,又可以作为友元函数,当然也有必须定义成友元函数的,比如>>和<<,因为他们的两个操作数都不是对象本身,

ostream& operator<<(ostream& os, const classType& obj);

则第一个参数是该运算符的第一个操作数,然而,却不是类对象,所以当该类运算符重载时写在类的内部时,又为了访问类内除public外的其它变量或函数,

则应当声明为友元函数:

friend ostream& operator<<(ostream& os, const classType& obj);

另外对于运算符重载时的const修饰问题,我总结下,有错误的或者不完整的欢迎指正补充

(1)一般形参用引用传递,因为这样无需在栈内存中开辟空间以装载临时对象,也省去了复制的耗时过程。

(2)当不希望函数改变形参的值时,最好用const修饰。不然在引用传递时,形参改变意味着实参也改变了。

(3)对于函数加const修饰的情况,比如

bool operator<(const node &b) const

那是因为它表示这个函数不会修改该类的任何成员。
如果没有这个const,编译器不会允许这个运算符用于一个const对象

意思就是没有加 const 的函数不能在 const 对象上使用

原文地址:https://www.cnblogs.com/mini-coconut/p/9420499.html

时间: 2024-10-14 01:37:06

重载运算符问题的相关文章

C++学习之重载运算符1

C++除可重载函数之后,还允许定义已有的运算符,这样通过运算符重载可像处理数据使用它们. 先来个代码 1 #include<iostream> 2 using namespace std; 3 4 class num 5 { 6 public: 7 num(){n=1;} 8 ~num(){} 9 int get() const{return n;} 10 void set(int x){n=x;} 11 private: 12 int n; 13 }; 14 15 int main() 16

矩阵求和--重载运算符

C++习题 矩阵求和--重载运算符 [Submit][Status][Web Board] Description 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<"和流提取运算符">>",使之能用于该矩阵的输入和输出. Input 两个2行3列矩阵 Output 矩阵之和 Sample Input 1 2 34 5 67 8 91 2 3 Sa

重载()运算符和重载强制类型转换

// 研究了半宿.最终弄清楚了 // 写了这段測试代码能够非常好的演示效果 class CConvert { public: CConvert(){m_nValue = 10;} // 重载()运算符 int operator ()(); // 重载int强制类型转换 operator int(); protected: private: int m_nValue; }; int CConvert::operator ()() { return m_nValue; } CConvert::ope

C++自学笔记_重载运算符_《C++ Primer》

#include <iostream> #include <stdexcept> using namespace std; class CheckedPtr{ public: CheckedPtr(int *b,int *e,int *c): beg(b),end(e),curr(c){ } CheckedPtr(const CheckedPtr &obj): //复制构造函数 beg(obj.beg),end(obj.end),curr(obj.curr){ } Chec

作为类的成员函数,重载运算符只能有一个参数

1 overload a operator of a class, you can only use one para., this pointer is automatically used. class Rational { public: //not correct since this ponit would be used automatically. //Rational operator+ (const Rational& lhs, const Rational& rhs);

C++习题 复数类--重载运算符+,-,*,/

Description 定义一个复数类Complex,重载运算符"+","-","*","/",使之能用于复数的加.减.乘.除.运算符重载函数作为Complex类的成员函数.编写程序,分别求两个复数之和.差.积和商. Input 两个复数 Output 两个复数之和.差.积和商 Sample Input 3 4 5 -10 Sample Output c1+c2=(8.00,-6.00i) c1-c2=(-2.00,14.00

operator重载运算符

1.重载运算符的函数一般格式如下 函数类型    operator  运算符名称    (形参表列) {对运算符的重载处理} 例如,想将“+”用于Complex(复数)的加法运算,函数的原型可以是这样的: Complex operator + (Complex & c1,Complex &c2); operator+函数表示对运算符+重载.其中,operator是关键字,专门用于定义重载运算符的函数的,运算符名称就是C++提供给用户的预定运算符. 注意:函数名是由operator和运算符组

C++学习27 用全局函数重载运算符

运算符重载函数既可以声明为类的成员函数,也可以声明为所有类之外的全局函数. 运算符重载函数作为类的成员函数 将运算符重载函数声明为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数.之所以少一个参数,是因为这个参数是隐含的. 例如,上节的 complex 类中重载了加法运算符: complex operator+(const complex & A)const; 当执行: c3 = c1 + c2; 会被转换为: c3 = c1.operator+(c2); 通过 this 指针隐式

C# 重载运算符

如果你想让自己定义的类型可以用运算符进行运算,那么可以通过重载运算符来实现: 示例: class Salary { public int RMB { get; set; } public static Salary operator +(Salary s1, Salary s2) { return new Salary { RMB = s1.RMB + s2.RMB }; } } //调用 Salary mikeIncome = new Salary { RMB = 10 }; Salary r

C++习题 复数类--重载运算符2+

Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+c2,i+c1,c1+i均合法(设i为整数,c1,c2为复数).编写程序,分别求两个复数之和.整数和复数之和. Input 两个复数 一个复数和一个整数 一个整数和一个复数 Output 两个复数之和.复数和整数之和,整数和复数之和. Sample Input 3 4 5 -10 3 4 5 5 3 4 Sa