C++实例代码详解友元函数

C++实例代码详解友元函数

友元函数概念

友元函数是指可以访问一个类的私有成员和保护成员的非成员函数。友元函数不是类的成员函数,但是它可以访问类中的非公有成员。需要注意的是,友元函数不会被继承。

友元函数的语法格式如下:

friend return_type function_name( parameter_list );

其中,关键字 friend 声明了整个函数为友元函数,可以访问该类的私有成员和保护成员。return_type 指定函数的返回值类型,function_name 是函数名,parameter_list 是函数的参数列表。

友元函数的使用步骤

友元函数的使用步骤如下:

  1. 在类定义中声明友元函数,可以在类的任何区域声明,一般在 public、protected 或 private 区域之后声明。
  2. 实现友元函数,友元函数可以在类里面或外面定义。
  3. 调用友元函数。

友元函数的使用场景

友元函数在以下情况下应该使用:

  1. 当需要访问类的私有成员和保护成员,但是又不想成为类的成员函数,此时可以通过友元函数来实现。
  2. 当需要多个类之间相互访问非公有成员时,可以使用友元函数来实现。

示例一

#include <iostream>

using namespace std;

class CRectangle {
private:
    int width;
    int height;

public:
    CRectangle(int w, int h) : width(w), height(h) {}

    // 声明友元函数
    friend int getArea(CRectangle rect);
};

// 实现友元函数
int getArea(CRectangle rect) {
    return rect.width * rect.height;
}

int main() {
    CRectangle rect(3, 4);
    // 调用友元函数
    int area = getArea(rect);
    cout << "矩形面积为:" << area << endl;
    return 0;
}

在这个示例中,声明了一个 CRectangle 的友元函数 getArea,用来计算矩形的面积,该函数可以访问 CRectangle 的私有成员 widthheight

示例二

#include <iostream>

using namespace std;

class CCar;

class CDriver {
public:
    void drive(CCar *car);
};

class CCar {
private:
    int price;
    friend int getPrice(CCar car);
    friend void CDriver::drive(CCar *car);
};

// 实现友元函数
int getPrice(CCar car) {
    return car.price;
}

// 实现友元函数
void CDriver::drive(CCar *car) {
    cout << "正在开车,车的价格为:" << car->price << endl;
}

int main() {
    CCar car;
    car.price = 100000;
    CDriver driver;
    driver.drive(&car);
    return 0;
}

在这个示例中,声明了一个 CCar 类和一个 CDriver 类,CCar 类的 price 成员被声明为友元函数 getPrice 和友元类 CDriver 的成员函数 drive,这两个成员函数都可以访问 CCar 的私有成员 price。另外,CDriverdrive 成员函数拥有一个指向 CCar 对象的指针,通过指针来访问 CCar 的私有成员 price

以上是友元函数的详细讲解及实例代码,有任何问题可以提问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实例代码详解友元函数 - Python技术站

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

相关文章

  • Java使用线程池实现socket编程的方法详解

    Java使用线程池实现socket编程的方法详解 简介 Java中的线程池是用来管理和复用线程的工具。线程池可以减少线程的创建和销毁,节省了系统资源。在socket编程中,线程池可以避免创建大量的线程,优化程序性能。 线程池的实现 线程池的创建可以使用Java中的Executor或ExecutorService接口。这两个类都是Executor框架的一部分,…

    C 2023年5月23日
    00
  • VC实现Windows多显示器编程的方法

    下面是详细的讲解“VC实现Windows多显示器编程的方法”的完整攻略。 1. 概述 在现代计算机上使用多个显示器已经很常见了,其中在Windows操作系统下实现多显示器编程对于一些需要展示多个窗口或图形界面的应用非常有用处。本文将介绍在VC环境下如何实现Windows多显示器编程。 2. 实现 2.1 函数EnumDisplayDevices 在Windo…

    C 2023年5月23日
    00
  • C语言中循环语句练习实例

    下面我将详细讲解如何练习C语言中的循环语句。 什么是循环语句 在 C 语言中, 循环语句分为 for、while、do..while 三种类型。循环语句可以让程序多次执行同一段代码,简化程序逻辑。 循环语句的语法 for 循环语句语法 for (初始化表达式; 条件表达式; 更新表达式) { // 循环体语句 } 其中,初始化表达式只在循环开始时执行一次,条…

    C 2023年5月23日
    00
  • C语言代码规范

    一、问题引入 初入编程世界,我们不知道什么叫做好代码。一切以实现功能和快速上线项目为主,但编程经验增加,发现代码越来越难写,越来越难改。导致这样的原因是没有遵循一般性的编程规则或则没有良好的编程风格。俗话说:“无规矩不成方圆”,在编程水平上来后,就更应该遵循规则。 傻瓜都能写出计算机可以理解的代码。唯有能写出人类容易理解的代码的,才是优秀的程序员 好代码的检…

    C语言 2023年4月18日
    00
  • win7系统打开程序提示应用程序正常初始化0xc0000142失败的原因及解决方法

    win7系统打开程序提示应用程序正常初始化0xc0000142失败的原因及解决方法 问题描述 在使用Windows 7系统时,打开应用程序时会出现提示“应用程序无法启动,应用程序无法正常初始化(0xc0000142)。单击确认关闭应用程序。”的错误提示。 原因分析 0xc0000142错误通常指的是程序无法正常初始化,可能由于以下原因导致: 应用程序的关键文…

    C 2023年5月23日
    00
  • C语言基于EasyX绘制时钟

    下面是C语言基于EasyX绘制时钟的完整攻略: 准备工作 首先,需要安装EasyX图形库。EasyX是一个图形界面库,可以方便地在Windows平台上进行图形编程。EasyX官网提供了安装包以及一些基本的教程和案例,可以前往 https://easyx.cn/ 下载并安装。 绘制时钟的基本原理 绘制时钟需要用到EasyX封装的一些图形函数,包括绘制圆形、矩形…

    C 2023年5月23日
    00
  • C#中ToString数据类型格式大全(千分符)

    C#中的ToString()方法可以将一个对象转换成字符串类型。当我们使用ToString()方法时,可以携带一个参数。这个参数可以是标准格式字符串,也可以是自定义格式字符串。在这个参数中,我们可以设置Convert类中的几种数据类型格式。 以下是数据类型格式大全: c/C:货币(Currency)格式; d/D:十进制(Decimal)格式; e/E:科学…

    C 2023年5月24日
    00
  • C++实现路口交通灯模拟系统

    C++实现路口交通灯模拟系统完整攻略 介绍 本系统利用C++语言实现,模拟了路口交通灯的控制,包括车辆的停止和通行,交通信号的改变等。系统结构清晰,代码简单易懂,适合初学者学习C++语言的基础和面向对象编程的实现。 设计思路 本系统的设计思路涉及到面向对象编程的基本思想。首先将路口、红绿灯、车辆等实体抽象为类,通过类的成员函数实现对对象的控制。同时,本系统利…

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