c++成员函数和友元函数的使用及区别

为什么使用成员函数和友元函数

这个问题至关重要,直接影响着后面的理解:

  • 程序数据: 数据是程序的信息,会受到程序函数的影响。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。
  • 数据封装引申出了另一个重要的 OOP 概念,即 数据隐藏 。数据封装 是一种把数据和操作数据的函数捆绑在一起的机制, 数据抽象 是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。C++ 通过创建类来支持封装和数据隐藏(public、protected、private)。我们已经知道,类包含私有成员(private)、保护成员(protected)和公有成员(public)成员。默认情况下,在类中定义的所有项目都是私有的。
    由于C++的封装和隐藏特性,只有类定义的成员函数可以访问类定义的私有数据。
  • 成员函数是数据封装和数据隐藏的机制。
  • 友元是C++提供的一种破坏数据封装和数据隐藏的机制。
成员函数的使用

首先先看代码

class Stock{ //class declaration
private:
    std:: string company;
    long shares;
    double share_val;
    double total_val;
void set_tot(){ total_val=shares* share_val;}
public:
void acquire(const std:: string & co, long n, double pr);
void buy(long num, double price);
void se11(long num, double price);
void update(double price);
void show();
};//note semicolon at the end

注意这里面的private可以不写,如果不写的话默认是私有的。
其中,company、shares等都是Stock类的私有数据成员。如果试图使用非成员函数访问这些数据成员编译器禁止这样做。如果试图破解该机制,友元是另一种选择。

  • 实现类成员函数
    (1)定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类;
void Stock::update(double price)

(2)类方法可以访问类的private组件。

友元

C++是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。
C++设计者认为,如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做一点妥协以满足他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C++就有了友元(friend)的概念。打个比方,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私。
友元提供了一种普通函数或者类成员函数访问另一个类中的私有或保护成员的机制。也就是说有两种形式的友元:
(1)友元函数:普通函数对一个访问某个类中的私有或保护成员。
(2)友元类:类A中的成员函数访问类B中的私有或保护成员。
(3)友元成员函数

  • 友元函数
    创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend:
friend Time operator*(double m,constTime&t);

注意该声明可以在类外也可以在类中
这样即使operator不是成员函数 ,但它与成员函数的访问权限相同,可以访问类中的私有变量。

  • 友元类
    类Y的所有成员函数都为类X友元函数
class girl;
class girl{
private:
  char *name;
  int age;
  friend boy; //声明类boy是类girl的友元
};
class boy{
public:
  void disp(girl &);
};
void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数
{
    //借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量
   cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
}
  • 成员函数作友元
    类Y的一个成员函数为类X的友元函数
    目的:使类Y的一个成员函数成为类X的友元,具体而言:在类Y的这个成员函数中,借助参数X,可以直接使用X的私有变量
    语法:声明在公有中 (本身为函数)
    声明:friend + 成员函数的声明
    调用:先定义Y的对象y—使用y调用自己的成员函数—自己的成员函数中使用了友元机制

class Stock{ //class declaration
private:
    std:: string company;
    long shares;
    double share_val;
    double total_val;
void set_tot(){ total_val=shares* share_val;}
public:
void acquire(const std:: string & co, long n, double pr);
void buy(long num, double price);
void se11(long num, double price);
void update(double price);
void show();
};
class Market{
    friend void Stock::acquire(const std:: string & co, long n, double pr);
    //Stock类下的acquire可以作为该成员函数的友元函数,可以访问该类的私有变量
    int price;
    int fiture;
public:
    void stuff();
};

如代码所示,Stock类下的acquire函数作为Market的友元函数可以访问market类的私有变量。

友元函数和类的成员函数的区别

友元函数和类的成员函数的区别成员函数有this指针,而友元函数没有this指针。友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值