C++学习笔记

1.运算符重载

为什么要对运算符进行重载?

C++中预定义的运算符的操作对象仅限于基本的内置数据类型,而对于我们自定义的类型(类)是没有办法操作的。但是大多数时候我们需要对我们定义的类型进行运算,这个时候就需要我们对这些 运算符进行重新定义,赋予其新的功能,以满足自身的需求。

a.流运算符的重载

C++流插入(输出)和流提取(输入)运算符的重载

注意:
1.由于ostream类型已经在iostream中实现,所以不能作为ostream类的成员函数重载,只能作为全局函数或友元函数重载。
流运算符为什么不能重载为成员函数,只能用友元函数重载

2.cout 是在 iostream 头文件中定义的 ostream 类的对象。
因此重载运算符时
istream & operator >> (istream &, 自定义类 &);
ostream & operator << (ostream &, 自定义类 &);
为了避免产生歧义,第一个参数最好不要直接写成cout或cin

ostream & operator<<(ostream & cout, const CStudent & s) {//此处为了节省运行时间,使用了CStudent &
	cout << s.age;
	return cout;
}

最好写为

ostream & operator<<(ostream & o, const CStudent & s) {//此处为了节省运行时间,使用了CStudent &
	o << s.age;
	return o;
}

3.流提取和流插入运算符的重载函数的返回值必须是istream或ostream类的引用
istream & operator >> (istream &, 自定义类 &);
ostream & operator << (ostream &, 自定义类 &);
原因:返回类型为引用是为了能够连续的输入输出,第一个参数类型为引用是为了将实参cout直接传给形参,以便带回重载后修改的值。

b.特殊运算符的重载

C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)理解。

运算符的意义:
在C++中,运算符重载是很重要的、很有实用意义的。它使类的设计更加丰富多彩,扩大了类的功能和使用范围,使程序易于理解, 易于对对象进行操作,它体现了为用户着想、方便用户使用的思想。有了运算符重载,在声明了类之后,人们就可以像使用标准类型一样来使用自己声明的类。类的声明往往是一劳永逸的,有了好的类,用户在程序中就不必定义许多成员函数去完成某些运算和输入输出的功能,使主函数更加简单易读。好的运算符重载能体现面向对象程序设计思想。

在运算符重载中使用引用(reference)的重要性。

利用引用作为函数的形参可以在调用函数的过程中不是用传递值的方式进行虚实结合,而是通过传址方式使形参成为实参的别名,因此不生成临时变量(实参的副本),减少了时间和空间的开销。

此外,如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在赋值号的左侧而成为左值(left value),可以被赋值或参与其他操作(如保留cout流的当前值以便能连续使用“<<”输出)。但使用引用时要特别小心,因为修改了引用就等于修改了它所代表的对象。

2.c++中return this和return *this的区别

this是指向自身对象的指针,*this是自身对象。
也就是说return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是克隆, 若返回类型为A&, 则是本身 )。

return this返回当前对象的地址(指向当前对象的指针)
return *this和return this有什么区别?

上一篇:柔性数组


下一篇:gitlab安装