C++中成员函数和友元函数的使用及区别详解

 更新时间:2022年01月26日 16:16:56   作者:夜猫子~~~  
大家好,本篇文章主要讲的是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指针。友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。

总结

到此这篇关于C++中成员函数和友元函数的使用及区别详解的文章就介绍到这了,更多相关C++成员函数和友元函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言的动态内存管理的深入了解

    C语言的动态内存管理的深入了解

    这篇文章主要为大家详细介绍了语言C的动态内存管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++实现特殊矩阵的压缩存储算法

    C++实现特殊矩阵的压缩存储算法

    在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定的规律,称这类型的矩阵为特殊矩阵。本文将利用C++实现特殊矩阵的压缩存储,感兴趣的可以了解一下
    2022-08-08
  • 简单了解C++常见编程问题解决方案

    简单了解C++常见编程问题解决方案

    这篇文章主要介绍了C++常见编程问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • C++之list容器模拟实现方式

    C++之list容器模拟实现方式

    这篇文章主要介绍了C++之list容器模拟实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 如何用C++制作LeetCode刷题小技巧-错题记录本

    如何用C++制作LeetCode刷题小技巧-错题记录本

    这篇文章主要介绍了如何用C++制作LeetCode刷题小技巧-错题记录本的方法,需要的朋友可以参考下
    2021-04-04
  • 给ActiveX签名的实现方法详解

    给ActiveX签名的实现方法详解

    本篇文章是对给ActiveX签名的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++驱动bash的实现代码

    C++驱动bash的实现代码

    这篇文章主要介绍了C++驱动bash的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • c++中的system(

    c++中的system("pause")的作用和含义解析

    这篇文章主要介绍了c++中system("pause")的作用和含义,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-03-03
  • C++11 强类型枚举相关总结

    C++11 强类型枚举相关总结

    这篇文章主要介绍了C++11 强类型枚举的相关资料,帮助大家更好的理解和学习使用c++11,感兴趣的朋友可以了解下
    2021-02-02
  • C语言实现简单通讯录功能

    C语言实现简单通讯录功能

    这篇文章主要为大家详细介绍了C语言实现简单通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论