首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否继承了非成员友元函数重载运算符?

非成员友元函数不能被继承,因为友元函数是在类外部定义的函数,它不属于类的成员函数。继承只能继承类的成员函数和成员变量,无法继承类外部的函数。友元函数的作用是允许该函数访问类的私有成员,但它与继承没有直接的关系。

友元函数重载运算符是指在类外部定义的重载运算符函数,并且该函数被声明为类的友元函数,以便访问类的私有成员。在继承中,子类会继承父类的成员函数和成员变量,但不会继承父类的友元函数。所以,子类无法直接继承父类的非成员友元函数重载运算符。

然而,子类可以通过自己定义相同的友元函数重载运算符来实现类似的功能。子类可以在自己的定义中重新定义友元函数,并在其中访问父类的私有成员。这样,子类就可以实现类似于继承父类友元函数的效果。

需要注意的是,子类重新定义的友元函数重载运算符与父类的友元函数重载运算符是完全独立的,它们具有不同的函数体和行为。子类的友元函数只能访问子类的私有成员,而不能访问父类的私有成员。

总结起来,非成员友元函数重载运算符不能被继承,但子类可以通过重新定义相同的友元函数来实现类似的功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

运算符成员函数函数重载

我们介绍运算符重载的目的和一个简单的应用案例。但运算符重载绝非我们想想的那么简单和容易,有很多陷阱我们如果我们还没有去踩过,是不会了解清楚内部的工作原理的。...本文只介绍一下运算符重载的两种方式,成员函数重载函数重载,并不具体到某些运算符的具体案例。...// 此句等同于 c3 = c1.operator+(c2) Complex c3 = c1 + c2; c3.display(); return 0; } 函数重载,与成员函数不同的是...,全局的函数需要传递两个参数,因为他并没有在类中,所以成员函数的this必须转化一个为operator+的参数,否则无法完成函数功能: #include using namespace std;...class Complex { public: Complex(int x, int y) :_x(x), _y(y){} // 将一个全局的 operator+ 函数声明为Complex的函数 friend

22540

C++运算符重载形式——成员函数or函数

一般来说,C++运算符重载可采用成员函数函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。...(1)当重载成员函数时,会隐含一个this指针;当重载函数时,不存在隐含的this指针,需要在参数列表中显示地添加操作数。...(2)当重载成员函数时,只允许右参数的隐式转换;当重载函数时,能够接受左参数和右参数的隐式转换。...,最好将其重载函数;而对于单目运算符,则最好重载成员函数。...有些双目运算符是不能重载函数的,比如赋值运算符=、函数调用运算符()、下标运算符[]、指针运算符->等,因为这些运算符在语义上与this都有太多的关联。

2.3K20
  • 【C++】运算符重载 ③ ( 二运算符重载 | 运算符重载步骤 | 全局函数 实现 运算符重载 | 成员函数 实现 运算符重载 | 函数 实现 运算符重载 )

    二、函数实现运算符重载 1、函数实现运算符重载 如果类中的成员都是私有成员 , 在 运算符重载 中 , 需要访问 私有成员 进行计算 , 在 成员函数 中 , 可以正常访问 私有成员 , 但是...在 全局函数 中 , 就无法访问 私有成员 ; 此时就需要将 全局函数 声明为 类的 函数 , 这样才能再 该 全局函数 ( 函数 ) 中访问 私有成员 ; 类中的 成员变量 是 私有成员...; private: int age; // 年龄 int height; // 身高 定义 全局函数 , 该全局函数中访问了 类中的 私有成员 , // 使用 全局函数 实现 运算符重载...+ s2.age, s1.height + s2.height); return student; }; 需要将 全局函数 声明为 函数 , 此时 使用 全局函数 实现 运算符重载 正常执行 ;...private: friend Student operator+(Student& s1, Student& s2); 2、代码示例 - 函数实现运算符重载 代码示例 : #include "

    16740

    【C++】运算符重载 ⑧ ( 左移运算符重载 | 函数 成员函数 实现运算符重载 | 类对象 使用 左移运算符 )

    一、左移运算符重载 1、函数 / 成员函数 实现运算符重载 运算符重载 的正规写法一般都是 使用 成员函数 的形式 实现的 ; 加法 + , 减法 - , 自增 ++ , 自减 - - , 一般都使用成员函数...实现 运算符重载 ; 上述 运算符重载 既可以使用 成员函数 进行重载 , 又可以使用友函数进行重载 ; 只能使用 成员函数 重载运算符 : = , [] , () , -> 等操作符 只能使用...成员函数 进行重载 ; 只能使用 函数 重载运算符 : 无法修改 左操作数 的情况下 , 只能使用 全局函数 ( 需声明 函数 ) 进行重载 ; 2、类对象 使用 左移运算符 平时使用 cout...(或没有可接受的转换) 如果想要使用 cout << s1 << endl; 用法输出对象到日志中 , 需要重载 左移操作符 ; 3、左移运算符 << 重载 使用 全局函数 实现 左移运算符 << 重载...: 首先 , 写出函数名 , cout << s1 左移操作符重载 , 函数名规则为 " operate " 后面跟上要重载运算符 , 函数名是 operate<< ; operate<< 然后 ,

    24110

    C++ 操作符重载形式——成员函数 or 函数

    一般来说,C++ 运算符重载可采用成员函数函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。...当重载成员函数时,会隐含一个 this 指针;当重载函数时,不存在隐含的 this 指针,需要在参数列表中显示添加操作数。...当重载成员函数时,只允许右参数的隐式转换;当重载函数时,能够接受左参数和右参数的隐式转换。...,最好将其重载函数;而对于单目运算符,则最好重载成员函数。...有些双目运算符是不能重载函数的,比如赋值运算符=、函数调用运算符()、下标运算符[]、指针运算符->等,因为这些运算符在语义上与this都有太多的关联。

    99730

    从零开始学C++之运算符重载(一):以成员函数方式重载、以函数方式重载

    运算符(参数表); 成员函数定义的格式: 函数类型 类名::operator 运算符(参数表) { 函数体; } 三、非成员函数重载 函数原型的格式: friend...*fp)(5); // 这么用,相当于调用obj.func(5); 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的函数。...以下一些双目运算符不能重载为类的函数:=、()、[]、->。...类型转换运算符只能以成员函数方式重载(见这里) 流运算符只能以的方式重载(见这里) #ifndef _COMPLEX_H_ #define _COMPLEX_H_ class Complex...成员函数,但c1.Add(c2); 改变的是c1 本身;如果我们想实现加号表达式,c3 = c1 + c2; 那么可以实现operator+ 运算符重载,可以是成员函数形式,也可以是形式,如果两者共存的话成员函数优先

    94700

    【C++】运算符重载 ⑤ ( 一运算符重载 | 使用 成员函数 实现 前置 ++ 自增运算符重载 | 使用 成员函数 实现 前置 - - 自减运算符重载 )

    一、一运算符重载 1、使用 成员函数 实现 前置 ++ 自增运算符重载 使用 全局函数 实现 前置 ++ 自增运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符...+(const Student& s1) 全局函数 : 参数是 2 个对象的引用 , 如 : operate+(Student& s1, Student& s2)\ 此处由于是一运算符重载 , 只需要对本对象进行操作..., 编写具体的运算符操作业务逻辑 ; // 使用 成员函数 实现 前置 ++ 自增运算符重载 // 重载 前置 ++ 运算符 // 实现 1 个 Student 对象 自增运算 // 由于 参数中的...& s1) 全局函数 : 参数是 2 个对象的引用 , 如 : operate+(Student& s1, Student& s2)\ 此处由于是一运算符重载 , 只需要对本对象进行操作 , 因此没有参数..., 编写具体的运算符操作业务逻辑 ; // 使用 成员函数 实现 前置 -- 自减运算符重载 // 重载 前置 -- 运算符 // 实现 1 个 Student 对象 自增运算 // 由于 参数中的

    17440

    【C++】成员函数重载和一运算符

    重载双目运算符时,运算符函数中应该具有两个参数,若运算符函数作为类的成员函数(当运算符重载函数作为类的成员函数时,要求操作数左边必须是一个对象,而函数的参数可以是同类的对象也可以是普通的变量),则只需要一个参数...双目运算符 双目运算符就是具有两个操作数的运算符。如 +、-、==等。 对双目运算符而言,成员函数重载运算符函数参数表中只有一个参数,而用友函数重载运算符函数参数表中含有两个参数。...成员函数重载 == 、>运算符: bool operator==(CTime& time); bool operator>(CTime& time); //判断对象的每个成员变量是否相等...*this + time;//由于前面的函数已经重载加号运算符,里面已经定义好了相关的操作,所以这句代码调用了加号运算符重载函数,并将对象的秒数加一 return *this; //前置++...,所以需要创建一个临时变量保存好这个对象的值 CTime time2(0, 0, 1);//定义一个秒数为1的对象 *this = *this + time2;//同上调用了加法运算符重载函数

    52120

    【C++】运算符重载 ⑦ ( 一运算符重载 | 后置运算符重载 | 使用 全局函数 实现 后置 ++ 自增运算符重载 | 使用 成员函数 实现 后置 -- 自减运算符重载 )

    上一篇博客 【C++】运算符重载 ⑥ ( 一运算符重载 | 后置运算符重载 | 前置运算符重载 与 后置运算符重载 的区别 | 后置运算符重载添加 int 占位参数 ) 中 , 讲解了 前置运算符重载...++ ; operate++ 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ; 此处由于是一运算符重载 , 只需要对本对象进行操作 , 需要传入对象本身作为参数 , 另外为了与前置运算符作区分...实现 后置 – 自减运算符重载 使用 成员函数 实现 后置 – 自减运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符 , 函数名是 operate...-- ; operate-- 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ; 此处由于是一运算符重载 , 只需要对本对象进行操作 , 不需要将对象本身进行传入了 , 直接使用..., 编写具体的运算符操作业务逻辑 ; public: // 使用 成员函数 实现 后置 -- 自减运算符重载 // 重载 后置 -- 运算符 // 实现 1 个 Student 对象 自减运算

    18440

    c++一些问题2.0 函数运算符重载

    ---- 类:打破了类的封装。 a普通类声明为函数. 函数可以访问类中的私有成员,打破了类的封装。 b成员函数。一个类的成员函数是另一个类的函数。 c类。...,Triangle 可以访问Point的所有成员 public: //函数声明,想要访问数据成员,必须传递对象的引用,通过对象访问类。...001.PNG ---- 运算符重载(<<是最典型的的重载) a 函数重载。 b 成员函数重载。通过this指针访问本地的数据成员,可以少写一个参数。...一般格式 函数类型 operator 运算符(形式参数){ code } 不能重载的有5个 ....:(条件运算符) 注意: 重载不能改变运算符的运算对象 重载不能改变运算符的优先级 重载不能改变运算符的结合性 重载不能有默认的参数 ---- 代码 #include<iostream

    77150

    【C++初阶】—— 类和对象 (下)

    _day; } 注意: 重载操作符必须有一个自定义类型参数 运算符重载定义在类外时不能访问类中的私有成员,因此重载成员函数 作为类成员函数重载时,成员函数的第一个参数为隐藏的this 赋值运算符重载...如果在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突 3.... : 提供一种突破封装的方式,有时提供便利。但是会增加耦合度,破坏了封装,所以不宜多用。...分为: 函数 函数 如果尝试去重载operator<<,我们发现没办法将operator<<重载成员函数,因为函数的参数位置不一样,cout的输出流对象和隐含的this指针在抢占第一个参数的位置...,则不能说明C时A的 关系不能继承,在继承位置再给大家详细介绍 关于关系的单向性我举个例子: class A { friend class B; public: // ......

    6110

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    ,但要求如果某个函数出现引用限定符,则其具有相同参数列表的所有版本都需要有引用限定符 14 重载运算和类型转换 重载运算符的参数数量必须和这个运算符默认情况下的参数一致,而且其优先级和结合律无法改变即与默认情况一致...有的运算符(如加号+)有一版本和二版本,我们用参数数量区分它们 我们不能创建新的运算符 重载运算符的本质是函数调用,因此向逻辑运算符,逗号运算符之类的运算符内在的短路求值特性等将被舍弃,参数们都会被以未定义的顺序求值...默认情况下lambda表达式不能改变它捕获的变量因为它的函数调用运算符重载为const的 标准库functional中定义一系列表示算术运算符,赋值运算符和默认析构函数的模板类,我们可以用这些类替换掉默认的运算符改变容器的操作...定义方法是在声明函数名的时候函数体类似显式默认构造的写法改写为=0,只能对虚函数使用这个写法 只对被声明的类有效,的基类或派生类都不是 某个类对其继承来的成员的访问权限受到两个因素的影响:...类模板与另一个模板直接最常见的是一对一的,首先模板需要声明所有需要用到的名字,然后在声明时标注出目标类的具体模板实参 类模板也可以一对多,方法是直接将目标模板的名字标为,这样就与目标模板的所有实例都成为了

    1.7K10

    C++ 知识点总结篇

    常量; 代码区:存放类成员函数、其他函数代码; 栈区:存放局部变量、函数参数、返回数据、返回地址; 堆区:自由存储区; 运算符重载重载形式 重载为类的成员函数,参数个数比原来的运算数少一个 ...operator () { ; } 重载为类的函数,参数个数与原运算数个数一样多; friend operator ()...; 保护继承 protected:父类的公有成员和保护成员成为子类的保护成员,且只能被他的派生类成员函数访问,父类私有成员仍为私有; 派生类构造函数调用顺序: 调用基类的构造函数,调用顺序按继承时说明的顺序...; } 虚函数函数必须是类的成员函数,不能是,但可以是另一个类的,不能为全局函数,也不能为静态函数,析构函数可以为虚函数,但构造函数不能为虚函数; 变量初始化 局部变量:定义时,系统不会进行初始化...; 全局变量:定义时,系统自动初始化, 函数 在类中定义过,但不是成员函数,定义在类外部,但有权访问类中成员; this 指针 只有成员函数才有 this指针,函数没有 this 指针;

    50030

    1小时精通c++面向对象编程

    五、多态性和虚函数 5.1 多态性 发出同样的消息被不同类型的对象接受导致完全不同的行为 多态可分为:静态多态性与动态多态性(必须存在于继承的环境之中) 5.1.1 函数重载 在类中,构造函数可以重载,...图5-1 构造函数重载 5.1.3 哪些运算符可以重载? ?...图5-2 运算符重载 5.1.4 重载为类的成员函数 重载运算符,不再显式说明参数 重载运算符,只显式说明一个参数;该参数为操作数的右操作数,左操作数由this指针(指向调用该成员函数的对象)提供...图5-3 重载成员函数 5.1.6 重载函数 重载函数时,没有隐含的参数this指针,即不改变原有运算符的语法结构 下列运算符不能重载函数:=、()、[]、-> 重载函数运算符重载函数的格式...图5-4 重载函数 5.2 静态束定(静态联编) 静态联编是指联编工作在编译阶段完成的,这种联编过程是在程序运行之前完成的,又称为早期联编。

    84430

    C++基础(五).多态

    ---- 相关概念 重载 同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数重载不关心函数返回类型 隐藏 派生类的函数屏蔽与其同名的基类函数...是一种定义在类外部的普通函数,但他需要在类体内进行说明,为了和该类的成员函数加以区别,在说明时前面加以关键字friend。不是成员函数,但是他能够访问类中的私有成员。...的作用在于提高程式的运行效率,但是,他破坏了类的封装性和隐藏性,使得非成员函数能够访问类的私有成员 能够是个函数,该函数被称为函数也能够是个类,该类被称为函数 函数的特点是能够访问类中的私有成员的非成员函数...当一个类作为另一个类的时,这就意味着这个类的任何成员函数都是另一个类的函数 Tip: 引自 C++中友详解 ---- 代码示例 要求 用友函数实现clock类的前置、后置单目运算符重载...friend Clock operator ++ (Clock &c,int); //使用友函数的方式对后置++运算符进行重载,注意这里使用别名的方式来引用被操作的对象,为了区别于前置重载,这里留出一个

    65420

    C++类和对象 的复习

    函数 内联函数 类的静态成员 类访问修饰符 继承 特点 基类/派生类 多继承 运算符/函数重载 多态 类和结构体的区别 C++ 中保留了C语言的 struct 关键字,并且加以扩充。...类的函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。...尽管函数的原型有在类的定义中出现过,但是函数并不是成员函数可以是一个函数,该函数被称为函数也可以是一个类,该类被称为类,在这种情况下,整个类及其所有成员都是。...只有类和函数可以访问私有成员。默认情况下,类的所有成员都是私有的。...选择最合适的重载函数重载运算符的过程,称为重载决策。

    54430

    大学C++课程提炼概括【C++笔记】

    ,所以函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号; //3)函数不能直接访问类的成员,只能访问对象成员; //4)函数可以访问对象的私有成员...c=a*b+complex(1,2); a.show(); b.show(); c.show(); } //函数实现运算符重载的交换律 //重载函数作为类成员函数时...,被重载运算符左侧必须是一个对象 a+b a必须是一个对象b不是该类对象,就不可交换 //函数,使重载预算符可以在某类私有成员私有之间运算,所以满足交换律 //运算符重载规则: //"....:"条件运算符 这五个不可重载 //重载不会改变运算符优先级 //重载双目运算符 "==" ">" "<" //要构建一个String 类,重载函数函数的形式出现在类中,双目符重载函数作为成员函数报错...但考虑到各方面的因素,一般将单目运算符重载成员函数,将双目运算符重载函数

    36770

    运算符重载

    运算符重载 函数 函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。...尽管函数的原型有在类的定义中出现过,但是函数并不是成员函数。...若类B是类A的。则只有类B的成员函数可以访问类A中的隐藏信息 是单向的,不具有交换性。 若类B是类A的,类A不一定是类B的,要看在类中是否有相应的声明。 关系不具有传递性。...若类B是类A的,类C是B的,类C不一定是类A的,同样要看类中是否有相应的申明 类以及函数示例程序 //demo1.cpp #include using namespace...重载运算符可以使用成员函数或非成员函数(一般是函数)两种方法 只能使用其中的一种方法 关键字operator 类名 operator运算符(const 类名& other);//成员函数实现 Complex

    93260
    领券