C++中的friend函数详细解析

C++中的friend函数详细解析

friend是C++语言中的一个关键字,用于在一个类中声明其它类或者函数成为友元,可以让友元类或者友元函数能够访问本类的私有成员。friend也是一个强大的功能,但是使用不当可能打破了类的封装性。

基本语法

在C++中,使用friend关键字声明一个友元类或者友元函数,例如:

class MyClass{
private:
    int x;
public:
    friend void friendFunction(MyClass obj);  //声明友元函数
    friend class FriendClass;  //声明友元类
};

使用friend关键字声明的类或者函数,在访问MyClass的私有成员时,不再受到访问限制。

友元函数

友元函数是一个非成员函数,但可以访问定义类的非公有成员。下面是一个简单的示例:

#include<iostream>
using namespace std;

class Box{
    private:
        double length;
    public:
        Box(double len){
            cout<<"构造函数调用"<<endl;
            length = len;
        }
        double getVolume(void){
            return length * length * length;
        }
        friend void printVolume(Box box);
};

void printVolume(Box box){
    cout<<"Box 的容积是:"<<box.getVolume()<<endl;
}

int main(){
    Box box(3.0);
    printVolume(box);
    return 0;
}

这个例子中,Box类有私有成员length和一个公有函数getVolume,友元函数printVolume调用了函数getVolume。

友元类

被声明为友元的类,可以访问另一个类的所有成员。下面是一个示例:

#include<iostream>
using namespace std;

class Box{
    friend class BigBox;  //声明BigBox类为Box类的友元
    private:
        double length;
    public:
        Box(double len){
            cout<<"构造函数调用"<<endl;
            length = len;
        }
        double getVolume(void){
            return length * length * length;
        }
};

class BigBox{
    public:
        double getLength(Box box){
            return box.length;
        }
        void setLength(Box& box, double len){
            box.length = len;
        }
};

int main(){
    Box box(3.0);
    BigBox bigBox;
    cout<<"Box的长度是:"<<bigBox.getLength(box)<<endl; 
    bigBox.setLength(box, 4.0);
    cout<<"Box的长度是:"<<bigBox.getLength(box)<<endl; 
    return 0;
}

这个例子中,BigBox类被声明为Box类的友元类。因此,BigBox类可以访问Box类的所有成员,包括私有成员length。在main函数中,可以看到BigBox类通过getLength和setLength函数分别获取和修改Box类对象的私有成员length的值。

以上是关于C++中的friend函数的详细解析,友元函数和友元类都是一种强大的工具,但是在使用时需要慎重,避免打破类的封装性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的friend函数详细解析 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言代码实现简单的扫雷小游戏

    C语言代码实现简单的扫雷小游戏 一、游戏规则 扫雷是一款经典的单人益智小游戏,游戏场景是一个区块是由许多个格子组成的矩形网格,有一部分格子下面隐藏着地雷,玩家通过揭露不带雷的部分,最终找到所有地雷的位置。 具体游戏规则: 鼠标左键点开或标记可疑格子。 若点击的是地雷,则游戏结束,显示所有地雷的位置。 若点击的是数字,则显示周边8个格子中地雷的数量。 若点击的…

    C 2023年5月23日
    00
  • C语言实现扫雷经典游戏

    C语言实现扫雷经典游戏攻略 概述 扫雷经典游戏是一种利用逻辑推理完成的益智游戏。本攻略将详细讲解如何使用C语言实现扫雷经典游戏。 准备工作 在开始编写代码前,需要安装C语言编译器。常用的C语言编译器有GCC、Clang等,可根据自己的喜好选择。此外,还需要使用到C语言中的标准库函数,如rand()、time()等,需要确保它们的头文件stdlib.h和tim…

    C 2023年5月23日
    00
  • C++连接并使用MySQL数据库

    一、C++连接MySQL数据库简介C++是一门非常流行的编程语言,除了可以进行基本的编程外,它还可以连接多种数据库进行数据操作,其中之一就是MySQL数据库。在本篇文章中,我们将讲解如何使用C++连接并操作MySQL数据库,并提供用C++语言的示例代码。 二、安装MySQL C++ Connector在使用C++连接MySQL数据库之前,需要先安装MySQL…

    C 2023年5月22日
    00
  • C语言零基础入门(1)

    一、C语言零基础入门(1)攻略 1.准备工作 在开始学习C语言之前,需要准备好以下工具和材料: 开发环境:Code::Blocks或其他C语言开发环境。 编译器:MinGW(Code::Blocks 17.12自带MinGW编译器)。 学习材料:C语言教材或视频教程。 2.基本语法 2.1.输出语句 在C语言中,可以使用printf()函数输出内容。示例如下…

    C 2023年5月22日
    00
  • 论C++的lambda是函数还是对象

    论C++的lambda是函数还是对象,这是一个较为复杂的话题。事实上,lambda既可以看作函数,也可以看作对象。下面我会从lambda的定义、基本语法、底层实现等方面进行详细讲解。 Lambda的定义 在C++11标准之前,我们只能使用函数指针定义一个可调用对象。而C++11引入了lambda表达式,使得我们可以更方便地定义可调用对象。 lambda表达式…

    C 2023年5月22日
    00
  • c4droid怎么安装 c4droid安装教程及使用说明

    C4droid是什么? C4droid是一款在安卓手机上运行C/C++代码的开发环境,它拥有完整的C/C++语言库,支持多文件编程、自动补全代码、调试程序等多种功能。在安卓上安装C4droid,可以让你在手机上随时随地编写并执行C/C++程序代码。 C4droid的安装 安装C4droid需要以下几个步骤: 步骤一:下载安装C4droid 在安卓市场或者官网…

    C 2023年5月23日
    00
  • 探究c++虚表实现代码

    探究 C++ 虚表的实现代码是一个相当深入的话题,需要对 C++ 对象模型以及函数调用机制有一定的了解。下面将介绍如何进行这样一个的探究,包括以下的几个部分: 对 C++ 对象模型的介绍 虚表的定义和用途 虚表的实现方式 通过示例说明虚表的使用和作用 对 C++ 对象模型的介绍 在了解虚表实现之前,我们需要先了解 C++ 对象模型。C++ 对象模型指的是 C…

    C 2023年5月23日
    00
  • C++表达式new与delete知识详解

    C++表达式new与delete知识详解 在 C++ 中,new 和 delete 是用于动态分配内存的表达式。new 用于分配内存,delete 用于释放内存。 new 表达式 基本语法 pointer = new type; 其中,pointer 是指向新的分配的内存空间的指针,type 是数据类型。new 表达式会分配一个存储类型为 type 的对象的…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部