一 类的朋友
class Object{
public:
Object(int v):value(v){
}
private:
int value;
};
void Print(Object* P){
printf("value : %d \n", P->value);
}
显然,在全局函数Print中无法访问Object对象的私有成员。
- 类的朋友的声明
在类A中,用friend关键字可以将一个全局函数声明为该类的朋友,也可以将另一个类声明为该类的朋友。
class Object{
//将全局函数Print声明为朋友
friend void Print(Object* P);
//类Somethingt声明为朋友
friend class Something;
};
原则上说,该函数,类只是这个类的朋友,而非成员。
(1)friend 声明语句:位置自由,一般放在类体大括号的最前头。注意区分类的声明和类的定义,这里只是声明一下。
(2)朋友拥有的权利:可以无限地访问该类的所有成员,不受protected/private的限制。(朋友关系是单向的,Something 类可以自由访问Object类,但反过来不成立。)
- 应用场景
正面作用:friend是不常用的语句,它可以破坏访问修饰符的作用,对类的封装构成威胁。
负面作用:可能应用的场景,在封装一个模块时,模块中有多个类,那么他们之间可以互相声明为朋友以便操作。也就是说,模块内部的类都是朋友,而外部调用者不是朋友,受访问修饰符的限制。
二 重载运算操作符
使用重载运算操作符,可以使得自己定义的类支持加减乘除等算术运算符。
- 第一种方式:成员操作符/类操作符(写在类里面)
Fraction operator + (const Fraction& other){
Fraction result;
//本对象和other对象,得出结果之后并返回
return result;
}
其中,operator + 是重载的操作符,形式上类似于成员函数。
注意⚠️:
(1)重载操作符的形式上像一个函数,但它不是函数
(2)名称:operator +, 这是固定不变的
(3)返回值:类型不变,总为该对象的类型
(4)参数:基本上不变
(5)受public/protected/private的限制
- 另一种方式:全局重载操作符(写在类外面)
默认地,操作符+已经支持了double+double,int+int等等,现在要求重载一下,支持Fraction + Fraction,即,已存在,
现在要写一种
Fraction operator + (const Fraction& a, const Fraction b);
注意⚠️:当类操作符和全局操作符同时被重载时,类操作符被优先调用;各种重载操作符的基本形式都是固定的。