友元函数

类的友元函数是定义在类外部,但有权访问类的所有私有成员和保护成员。尽管友元函数的原型有在类的定义中出现过,但友元函数并不是成员函数。

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。在这种情况下,整个类及其所有成员都是友元。如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字friend,如下所示:

class Box
{
    double width;
public:
    double length;
    friend void printWidth(Box box);
    void setWidth(double wid);    
};

声明类ClassTwo的所有成员函数作为类的ClassOne的友元,需要在类ClassOne的定义中放置如下声明:

friend class ClassTwo;
复制代码
/***
friend.cpp
***/
#include<iostream>
using namespace std;

class Box
{
    double width;
public:
    friend void printWidth(Box box);
    void setWidth(double wid);
};

void Box::setWidth(double wid)
{
    width = wid;
}

void printWidth(Box box)
{
    cout << "Width of box : " << box.width << endl;
}

int main()
{
    Box box;
    
    box.setWidth(10.0);
    printWidth(box);
    return 0;
}
复制代码

运行结果:

exbot@ubuntu:~/wangqinghe/C++/20190807$ ./friend

Width of box : 10

因为友元函数没有this指针,则参数要有三种情况:

  1. 要访问非static成员时,需要对象作为参数;
  2. 要访问static成员或者全局变量时,不需要对象作为参数;
  3. 如果做参数的对象是全局对象,则不需要对象做参数。

友元类的使用

复制代码
/***
classfriend.cpp
***/
#include<iostream>
using namespace std;

class Box
{
    double width;
public:
    friend void printWidth(Box box);
    friend class BigBox;
    void setWidth(double wid);
};

class BigBox
{
public:
    void Print(int width, Box &box)
    {
        box.setWidth(width);
        cout << "Width of box: " << box.width << endl;
    }
};

void Box::setWidth(double wid)
{
    width = wid;
}

void printWidth(Box box)
{
    cout << "Width of box : " << box.width << endl;
}

int main()
{
    Box box;
    BigBox big;
    
    box.setWidth(10.0);

    printWidth(box);

big.Print(20,box);
    return 0;
}
复制代码

运行结果:

exbot@ubuntu:~/wangqinghe/C++/20190807$ ./classfriend

Width of box : 10

Width of box: 20

posted @   王清河  阅读(1483)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2018-08-07 1017 Queueing at Bank (25)
点击右上角即可分享
微信分享提示