首页 > 其他分享 >友元函数

友元函数

时间:2024-05-23 17:18:34浏览次数:12  
标签:友元 函数 int class data public

特点

  • 友元函数不是成员函数,所以友元函数没有this指针。
  • 它可以访问类的私有(private)和保护(protected)成员。
  • 友元函数通常定义在类外,但在类中声明为友元。
  • 注意友元的定义要么放在最开始,要么放在最后。

友元函数

在类的定义中,可以使用friend关键字来声明一个友元函数。

class MyClass 
{  
private:  
    int privateData;  
  
public:  
    MyClass(int data) : privateData(data) {}  
  
    // 声明友元函数  
    friend void printPrivateData(const MyClass& obj);  
};  

// 定义友元函数  
void printPrivateData(const MyClass& obj) 
{  
    std::cout << "Private data: " << obj.privateData << std::endl;  
}

友元类

友元类的声明在类的声明中,实现在该类外。

class A
{
public:
    A(int _a):a(_a) {};
    friend class B;
private:
    int a;
};

class B
{
public:
    void print(A &obj)
    {
        cout << obj.a << endl;
    }
};


int main()
{
    A a(10);
    B b;
    b.print(a);
}

类的友元关系没有继承性。

假如类B是类A的友元,类C继承于类A,那么友元类B是没办法直接访问类C的私有或保护成员。

class A 
{  
private:  
    int a_data;  
  
public:  
    A(int data) : a_data(data) {}  
  
    friend class B; // 类B是类A的友元  
};  
  
class B 
{  
public:  
    // 由于B是A的友元,它可以访问A的私有成员  
    void printA(const A& obj) 
    {  
        std::cout << obj.a_data << std::endl;  
    }  
  
    // 但B不能访问C的私有成员,除非C显式地将B声明为其友元  
};  
  
class C : public A 
{  
private:  
    int c_data;  
  
public:  
    C(int aData, int cData) : A(aData), c_data(cData) {}  
  
    // 如果我们希望B能够访问C的私有成员,我们需要在C中声明B为友元  
    // friend class B; // 如果取消注释这行代码,B就能访问C的私有成员了  
};  
  
int main() {  
    A a(10);  
    B b;  
    b.printA(a); // 正确:B可以访问A的私有成员  
  
    C c(20, 30);  
    b.printC(c); // 错误(假设有这样的函数):B不能访问C的私有成员,除非C声明B为友元  
  
    return 0;  
}

友元关系没有传递性。

假如类B是类A的友元,类C是类B的友元,那么友元类C是没办法直接访问类A的私有或保护成员,也就是不存在“友元的友元”这种关系。

标签:友元,函数,int,class,data,public
From: https://www.cnblogs.com/baobaobashi/p/18209020

相关文章

  • mysql 取最后一条数据的函数
    在MySQL中,要获取表中的最后一条数据,通常会使用ORDERBY子句结合LIMIT子句来实现。但是,如果您的表中没有明确的排序字段,或者想要获取实时的最后一条数据(例如,在插入新数据后),您可以使用LAST_INSERT_ID()函数,这个函数返回最后一个被插入的自增ID值。如果您的表设置了自增主键,那么在插......
  • 力扣-636. 函数的独占时间
    1.题目题目地址(636.函数的独占时间-力扣(LeetCode))https://leetcode.cn/problems/exclusive-time-of-functions/题目描述有一个单线程CPU正在运行一个含有n道函数的程序。每道函数都有一个位于 0和n-1之间的唯一标识符。函数调用存储在一个调用栈上:当一个函......
  • C++类中封装指针函数
      classMyClass{public:voidfunc1(){//实现}voidfunc2(){//实现}//成员函数指针类型typedefvoid(MyClass::*MemberFuncPtr)();//一个成员函数指针成员变量MemberFuncPtrptrFunc;......
  • openAI assistants的自定义函数调用——类似HiAgent
    openAIassistants的自定义函数调用功能先添加函数: 和字节的hiagent非常相似。定义好函数以后。然后就是在客户端通过如下代码调用:  #读取系统变量fromdotenvimportload_dotenvload_dotenv()fromopenaiimportOpenAI#初始化客户端client=OpenAI()......
  • PHP函数 三角函数的基本使用
    直角三角函数的定义:正弦(sin)等于对边比斜边;sinA=a/c;余弦(cos)等于邻边比斜边;cosA=b/c;正切(tan)等于对边比邻边;tanA=a/b;余切(cot)等于邻边比对边;cotA=b/a;<?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);include......
  • PHP函数 向数组插入元素
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';//PHP向数组插入元素/***1、使用array_unshift()函数,向数组头插入新元素;*2、使用array_push()函......
  • PHP函数 explode和eval的使用
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';/***explode()函数把字符串打散为数组。*eval()函数把字符串按照PHP代码来计算。**/$val=&#......
  • 【代码】--库函数学习 spi.c
    1. SPI介绍    2. 全局结构体和用到的函数/***封装的SPI结构体**/typedefstruct{intnSpiFd;//spi文件描述符charnDevName[32];//spi名称,例/dev/spidev2.0intnSpeed;//spi通信速率intnBit;//为8,写死......
  • PHP函数 Math函数
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';//Math函数/***abs—绝对值*acos—反余弦*acosh—反双曲余弦*asin—反正弦*......
  • PHP函数 变量类型
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';//类型/***Boolean布尔类型*Integer整型*Float浮点型*String字符串*Numer......