三、友元

通常情况下,公有类方法是访问类的唯一途径,有时不方便,于是我们诞生了另外一种形式的访问权限:友元

分为三类:

  • 友元函数
  • 友元类
  • 友元成员函数

1、创建友元函数

1
friend Time operator*(const Time & t, double m);

放在类声明中,加上关键字friend

  • 虽然是在类声明中声明的,但是并不是成员函数
  • 与成员函数的访问权限相同

2、常用的友元:重载<<运算符

(1)第一种重载版本
1
2
3
Time operator<<(ostream &os, const Time & t) {
os << t.hours << t.minutes;
}
(2)第二种重载版本

如果使用第一种重载版本,如下语句就会发生异常

1
cout << time << "time" << endl;

所以我们采用如下方式,让其返回ostream对象引用即可:

1
2
3
ostream &  operator<<(ostream &os, const Time & t) {
os << t.hours << t.minutes;
}

只有在类声明的原型中才能使用friend关键字,否则函数定义也是原型,否则不能在函数定义中使用该关键字

六、类的自动转换和强制类型转换

内置类型转换:如果两种类型兼容,则会自动转换为接收类型的变量的类型

不自动转化不兼容的类型,如下是非法的:

1
int *p = 10

但是可以强制类型转化

1
int *p = (int *)10

1、转换函数