面向对象编程(c++)学习笔记六

一 类的朋友

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);

注意⚠️:当类操作符和全局操作符同时被重载时,类操作符被优先调用;各种重载操作符的基本形式都是固定的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值