首页 > 其他分享 >friend关键字扩展

friend关键字扩展

时间:2023-12-08 17:34:22浏览次数:37  
标签:友元 int double 扩展 关键字 声明 class friend

文章参考:

爱编程的大丙 (subingwen.cn)

1. 语法改进

在C++98中,如果想要声明类B是类A的友元类,需要class关键字,而在C++11中,可以省略关键字class,还可以使用别名。

EG:

  • C++98中:

    class B;
    class A{
        friend class B;		// 将B声明为A的友元
    private:
        int num;
    }
    class B{
    private:
        A a;
    public:
        B(){
          a.num = 10;		// 因为B是A的友元,所以B可以直接访问A内所有访问属性的成员
        }
    }
    
  • C++11中:

    class B;
    using B_1 = B;
    typedef B B_2;
    class A{
        friend B;		// 省略关键字class	
        friend B_1;		// 使用别名声明友元类
        friend B_2;		// 使用别名声明友元类
    private:	
        int num;
    }
    

2. 为类模板声明友元

C++11为我们提供了新的友元功能,即:为类模板声明友元。这样我们就可以根据需要来确定友元类。

注意:如果模板参数是基础数据类型,如intdouble,那么该模板参数的友元声明将会被忽略。

语法:

template <typename T>
class Test{
    friend T;
};
struct Base{
    int num;
}
int main(void){
    Test<Base> t1;
    Test<int> t2;
    return 0;
}
  • 第9行:Base类是Test的友元。
  • 第12行:int是基础数据类型,因此友元声明被忽略。

EG:

  • 场景:

    假设有一个矩形类、一个圆形类,在对其进行一些操作后,我们需要验证矩形的宽度和高度、圆形的半径是否满足要求,并且这些校验要求在另一个类中完成。

  • 代码:

    #include <iostream>
    using namespace std;
    
    template <typename T>
    class Rectangle{
    private:
        double h;
        double w;
    public:
        friend T;       // 友元声明
        Rectangle(double width, double height): w(width), h(height){} 
    };
    
    template <typename T>
    class Circle{
    private:
        double r;
    public:
        friend T;       // 友元声明
        Circle(double radius): r(radius){}
    };
    
    class Verify{
    public:
        Verify(double w, double h, Rectangle<Verify>& rectangle){
            if( rectangle.w >= w && rectangle.h >= h ){
                cout << "yes" << endl;
            } else{
                cout << "no" << endl;
            }
        }
    
        Verify(double r, Circle<Verify>& circle){
            if( circle.r >= r ){
                cout << "yes" << endl;
            } else{
                cout << "no" << endl;
            }
        }
    };
    
    int main(void){
        Rectangle<Verify> r(10, 20);
        Circle<Verify> c(10);
        Verify v1(10, 10, r);
        Verify v2(20, c);
        return 0;
    }
    
  • 输出:

    yes
    no
    

标签:友元,int,double,扩展,关键字,声明,class,friend
From: https://www.cnblogs.com/beasts777/p/17888675.html

相关文章

  • OSCP(扩展篇靶机SickOS1.1)
    第一步:nmap和niktonikto:https://zhuanlan.zhihu.com/p/124246499 8080http-proxy我们是利用3128查看nikto是否存在可利用的漏洞nikto-h192.168.107.148--useproxy192.168.107.148:3128扫描目标时,部分目标部署了防护设备,为避免暴露ip可以使用代理进行扫描,nikto支持......
  • scrapy框架之自定义扩展
    自定义扩展时,利用信号在指定位置注册制定操作源码剖析:1fromscrapy.extensions.telnetimportTelnetConsole#查看TelnetConsole源码23#Enableordisableextensions4#Seehttps://doc.scrapy.org/en/latest/topics/extensions.html5EXTENSIONS={6'scrapy.......
  • KubeVela 稳定性及可扩展性评估
    背景 随着v1.8的发布,基于OAM的应用程序交付项目KubeVela已经持续发展了3年多。目前已被各种组织采用并部署在生产环境中。无论是与托管定义一起使用还是在多个集群上进行管理,在单个KubeVela控制平面上运行数千个应用程序的情况并不少见。用户经常问的一个关键问题是......
  • 大数入门(2)——扩展的基本列与多元Veblen函数
    扩展——指数不动点进一步的,我们可以考虑\(\omega^{\omega^{\omega^{...}}}\)仿照\(\omega\)的定义,我们定义\(\epsilon_0=\sup\{\omega,\omega^\omega,\omega^{\omega^\omega},...\}\)另一种更为深刻的理解方式是:\(\epsilon_0\)是\(\alpha\rightarrow\omega^\alpha\)的第一个指......
  • Splay 伸展树扩展应用
    Update2023.5.27好吧,lxl好像已经发明过这种数据结构了(悲)。前言谈谈扩展Splay。(下文用KzSplay代替)前置知识:1.Splay,以及文艺平衡树。2.线段树。问题引入请你设计一种数据结构,支持在线处理以下操作:给定一个长度为\(n\)的序列\(a\)。1.支持序列的区间翻转。2.支持......
  • 关键字 开发-10 封装引用自定义函数变量
    前言前面在yaml文件中引用内置函数以及自定义函数和变量时,都是在每个关键字后面进行单独得渲染,为了方便引用,于是我们单独对这块的内容进行封装。1.新增自定义函数和变量在utils下新建自定义函数和变量的文件,my_builtins.py,新增了在接口中需要用到的一些变量和函数。这样,在传......
  • Java扩展赋值运算符,字符串连接符
    1.扩展赋值运算符  2.字符串连接符   ......
  • [c语言]volatile关键字的作用
    volatile描述volatile是C和C++都支持的一个关键字,是一种类型修饰符。这个关键字被设计用来告诉编译器,一个变量可能会在程序之外被改变,例如,它可能被中断服务程序修改,或者它可能映射到一个硬件寄存器,这个寄存器的值可能由硬件改变。因此,编译器不应对涉及volatile变量的操作进行优化,......
  • java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候
    java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。先......
  • jupyter notebook代码补全扩展安装遇到 Jupyter command `jupyter-contrib` not found
    Jupytercommandjupyter-contribnotfound.解决方案——新的安装方式。方法1:pip方式1.先使用以下命令,卸载旧版本的jupyter_contrib_nbextensions和upyter_nbextensions_configurator:分别用cmd命令,卸载之前的安装pipuninstalljupyter_contrib_nbextensionspipuninsta......