1.友元
是对类封装的一种补充
如果一个函数或类是另一个类的友元
可以直接访问b的私有成员
友元:不是成员
两种情况:友元声明可写在类中任意位置!!
友元函数
一个函数是另一个类的友元可以直接访问类的私有和保护成员
例如:
声明写在类内部
friend void func();
//声明是我的朋友
友元类
一个a类是一个b类型友元类
可以随访问b的所有元素
friend class 友元类名;*
友元可以写在类内
友元不是成员不受访问修饰词的影响
即使在内部也是他的友元
但是作用域会被限制 要先声明
a是b的友元 不能得出b是a的友元
友元关系不可传递 a是b b是c不能得出
a是c的友元
2.运算符重载
c++中有很多运算符,可直接用于基本数据类型
和标准库中定义的数据类型但是不能直接用于
程序员自定义类型的运算,
为什么标准库中自定义可以用+?
不是生来就行而是重载了加号运算符
运算符重载的实际是函数重载!
a+b;
成员函数时
等价于a.operator+(b);
友元函数时
等价于operator+(a,b);
//将参数传进去 剩下的事情由你来绝定
调用运算符会根据操作数去匹配相应的
重载函数
3.输入输出运算符
1).什么是输入输出运算符?
<< >>
其实>>一开始是 左移运算符,并没有输出功能,后面c++标准库重载了它
让其能够输出
cout是什么?
cout是ostream类唯一的一个对象(因为ostream类是单例模式-》只允许一个对象)
ostream是什么?
ostream是标准输出流的一个类,专门用于标准输出
在ostream类中重载了很多次operator<<,使之能输出不同类型数据
返回值都为ostream引用
为什么?
为了可以连续输出。
参数要么是 ostream的地址(重载为ostream的成员函数)
要蘑是ostream的引用(为友元函数),第二个参数是
根据输出的数据的类型const的引用
2)怎么去重载?
重载为ostream的成员函数?重载为ostream的友元函数?
重载为友元和成员都做不了,无论那种都需要做声明但是标准库不能去修改
那怎么办?
(1)重载为我们自己的成员函数可以吗?
因为成员变量的第一个参数一定是this而<<前面的参数是cout
不能使用。
(2)重载为自定义类型的友元函数!
ostream不能加const因为可能会在文件里面进行一个写操作
尽量不要去写换行!!***注意return语句***
3)为什么要重载?目的是什么?
为了去输出我们自定义类型,所以要重载。
cin与cout类似
是istream的唯一的对象,istraem中重载了很多次>>运算符,用于输出
第一个参数是istream& 或者 istream*
我们自己用的话要用自定义类型的友元
4.[]运算符
要加const就必须要加不能省略 常对象常对象作为参数只能调用常
不能调用非const函数!!和类走的static对象类似,逻辑上说不通
语法上也说不通!!!牢记要用const必须要有不能省略
const也算是一个类型区分的**
可以加const或没加const来进行重载
是什莫?
是下标运算符,需要两个操作数。 a[] //a操作数一,[]内操作数二
怎么重载
可以重载为友元也可以重载为友元
为什么要用?
用来方便我们
6.++运算符
1有什么用? 前++和后++区别
前++的值时加之后的值a本身(左值)
后++的值时a+1之前的值并且是个(右值)
2.怎么重载?
可以重载为成员和友元函数
两个运算符都一样参数也一样怎么区分?
c++规定 后++要多一个战位参数 int可以不带参数
该参数没有实际的意义,而是用来区分
前后++
--相同
7.不能重载的运算符
::
.
?:
.* .->
记住~!!!
8.重载运算符的时候不能改变运算符的本来的性质
操作数不能改变,优先级,结合性
并且不要改变它本来的含义