C++丨10丨运算符重载

一边写博客一边复习期末考...TT


目录

运算符重载(operator overloading)

重载运算符的规则

C++允许重载的运算符:

不能重载的运算符只有5个:

重载运算符的函数一般格式

重载为类的友元函数

参数

重载作为普通函数时:

重载作为类的成员函数时:

自增自减运算符【++】【--】

重载流提取运算符【>>】流插入运算符【<<】

不同类型数据间的转换

强制类型转换

用转换构造函数进行不同类型数据的转换

类型转换函数

重载类型转换运算符


运算符重载(operator overloading)

运算符重载的方法是定义一个重载运算符的函数

运算符函数是一种特殊的成员函数或友元函数。


重载运算符的规则

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

C++允许重载的运算符:

双目算术运算符丨+(加)、-(减)、*(乘)、/(除)、%(取模)
自增自减运算符丨++(自增)、--(自减)
位操作运算符 丨&(按位与)、|(按位或)、~(按位取反)、^(按位异或)、<<(左移)、>>(右移)
 逻辑运算符 丨&&(逻辑与)、||(逻辑或)、!(逻辑非)
 单目运算符 丨+(正)、-(负)、*(指针)、&(取地址)
 关系运算符 丨<、>、>=、<=、==、!=
 赋值运算符 丨=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
空间申请与释放丨new、delete、new[]、delete[]
 其他运算符 丨,(逗号)、[](下标)、()(函数调用)、->(成员访问)、->*(成员指针访问)

不能重载的运算符只有5个:

   .   丨成员访问运算符
   *   丨成员指针访问运算符
   ?:  丨三目运算符
 sizeof丨长度运算符
   ::  丨作用域运算符

重载不能改变操作数的个数、优先级、结合性、不能有默认参数、必须和用户自定义类型的对象一起使用。 (啊哈!对吧!所以不会有普通的普通函数。


重载运算符的函数一般格式

返回类型 operator 运算符名称 ( 形参表 )
{ 对运算符的重载处理 }

// + //
Complex Complex::operator+(Complex& b) // 是类外定义
{
	Complex a;
	a.real = real + b.real;
	a.imag = imag + b.imag;
	return a;
}

其中函数名是由【operator】和【运算符名称】组成。比如:【operator+】。

重载为类的友元函数

friend 返回类型 operator 运算符 ( 参数列表 )
{
    函数体
}

PS:在类外定义友元函数的时候,不要在函数头部加friend!然后函数名前也不需要写 xx:: ! (原因可以参见《Ruru的报错日常》。里面有记录。)


题外话:今天(5.4)遇到了Daniil,

他问我学什么专业,我说cs。

他问我学什么语言,我说我们正在学c++,他说他一开始也学这个hhh


参数

重载作为普通函数时:

// 嗯?普通函数...是指友元函数吗?

// 哦哦哦哦我懂了!这种就是普通的在类外定义的函数,下面那种是指别的类里面的函数,在我这里是friend

单目:右操作数是形参;

双目:左边形参作为运算符左操作数,右边形参是右操作数。

重载作为类的成员函数时:

如果运算符参数只有一个,那么不需要写参数;

如果运算符参数有两个,那么只需要写一个参数。

即参数比标准数据类型少一个!(因为类的成员函数默认有一个this指针。它会直接指向类本身。换句话说,当我们写出运算符重载时,有一个参数就已经被this指针包含了。)

单目运算符,this指向运算符右参数,因为单目运算符的参数一般都在右边。

双目运算符,this指向运算符左参数。


自增自减运算符【++】【--】

(还没写...请暂时参考:

十个 C++ 运算符重载示例,看完不懂打我..._c++运算符重载_阿基米东的博客-CSDN博客


重载流提取运算符【>>】流插入运算符【<<】

对于流而言,因为是双目运算符,this指针本应该指向左边的类,但左操作数是一个流,又与this的类型冲突。

因为this指针会默认指向类,而我们需要让左参数指向流,右参数指向类。所以重载就不能作为类的成员函数出现了。(所以意思是只能作为友元函数啦?w

这时,就需要用到友元函数friend。友元函数本身是一个普通函数,但是作为类的友元,能够调用类内的成员,包括private。而且参数不用被类限制为第一个必须是this所指的对象本身。

使用时,我们只需要在类内声明有个友元函数即可。(!!感觉又应证了为什么不用写 xx:: 哈哈哈哈

// >> //
friend istream& operator>>(istream& input, Complex& c) { // 提示:记得写&
	input >> c.real >> c.imag;
	return input;
}
// << //
friend ostream& operator<<(ostream& output, Complex& c) {
	output << "(" << c.real << "," << c.imag << "i)";
	return output;
}
// 这是类内定义的写法。类外定义时把friend删了即可

使用时正常使用就可以了!

int main(){

    Complex a, b, c;
    cout << "Complex: a+bi" << endl;

    cout << "Plz input ComplexA's [a] and [b] : ";
    cin >> a;

    cout << "Plz input ComplexB's [a] and [b] : ";
    cin >> b;

    c = a + b;
    cout << "A+B = " << c << endl;

}

不同类型数据间的转换

强制类型转换

1. typename(value); // C++的风格
2. (typename)value; // C语言的风格

用转换构造函数进行不同类型数据的转换

转换构造函数(conversion sonstructor function)的作用是将一个其他类型的数据转换成一个类的对象

回顾一些以前学习过的几种构造函数:(哈哈哈哈笑死我了。课本好贴心!但是自己确实很不熟悉这些内容...所以就搬过来了!)

默认构造函数:
    Compex (); // 没有参数
用于初始化的构造函数:
    Complex (double r, double i); // 形参列表中一般有两个以上参数
用于复制对象的复制构造函数:
    Complex (Complex &c); // 形参是本类对象的引用

现在要介绍的一种新的构造函数———转换构造函数!
    Complex (double r) // 任何转换构造函数只有一个形参
{
    real = r; imag = 0;
}
作用是将double型的参数r转换成Complex类的对象。

一些使用场景:
    Complex c(1.5); // 建立对象c,由于只有一个参数,调用转换构造函数
    Complex(2.5); // 建立一个无名的对象,合法,但无法使用它
    c = Complex(3.5); // 假设c已被定义为Complex对象

类型转换函数

类型转换函数(type conversion function)的作用是将一个类的对象转换成另一类型的数据(相当于转换构造函数的逆?!

X::operator T ()
// T可以是预定义类型,也可以是用户定义类型
// 无参数。无返回值类型。
// but必须有返回语句返回T类型的对象
// 只能作为成员函数,因为转换的主体是本类的对象。不能作为友元函数或普通函数
{
    return T类型的对象;
}

class Complex {
    operator double () {
        return real;
    }
}

重载类型转换运算符

operator data_type ()
{

return xxxx // 返回值的类型即为data_type,不需要再加返回值类型声明
}

// double //
	operator double() {
		double nm = double(kilometer / 1.852);
		return nm;
	}

注意: 上述即为类型转换运算符函数的定义模型。重载类型转换运算符必须为类的成员函数,不能有返回类型,形参列表也必须为空,通常是const的。


参考:

C++语法——详解运算符重载_就要 宅在家的博客-CSDN博客

c++报错:lvalue required as left operand of assignment_百口可乐__的博客-CSDN博客

【C】报错[Error] lvalue required as left operand of assignment_kerouacs的博客-CSDN博客

十个 C++ 运算符重载示例,看完不懂打我..._c++运算符重载_阿基米东的博客-CSDN博客

C++ 重载类型转换运算符_c++类型转换运算符重载_hui2702的博客-CSDN博客

C++中的运算符重载_c++可以重载的运算符_半岛青舟的博客-CSDN博客


(你为什么啥也不会啊!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值