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

将"-“运算符重载实现为类的友元函数

将"-"运算符重载实现为类的友元函数是指在一个类中定义一个友元函数,该函数重载了减法运算符"-",使得该类的对象可以直接进行减法运算。

重载运算符的目的是为了方便使用该运算符对类的对象进行操作,使得代码更加简洁和易读。

下面是一个示例代码,演示了如何将"-"运算符重载实现为类的友元函数:

代码语言:txt
复制
#include <iostream>

class MyClass {
private:
    int value;

public:
    MyClass(int val) : value(val) {}

    friend MyClass operator-(const MyClass& obj1, const MyClass& obj2);
    // 将"-"运算符重载为类的友元函数

    void display() {
        std::cout << "Value: " << value << std::endl;
    }
};

MyClass operator-(const MyClass& obj1, const MyClass& obj2) {
    int result = obj1.value - obj2.value;
    return MyClass(result);
}
// 友元函数的实现,重载了"-"运算符

int main() {
    MyClass obj1(5);
    MyClass obj2(3);

    MyClass obj3 = obj1 - obj2;
    // 使用重载的"-"运算符进行对象的减法运算

    obj3.display();
    // 输出结果为:Value: 2

    return 0;
}

在上述示例代码中,我们定义了一个名为MyClass的类,其中包含一个私有成员变量value和一个公有成员函数display()用于显示value的值。我们将"-"运算符重载为类的友元函数operator-(),该函数接受两个MyClass对象作为参数,并返回一个新的MyClass对象,该对象的value值为两个参数对象的value值之差。

在主函数中,我们创建了两个MyClass对象obj1和obj2,并使用重载的"-"运算符对它们进行减法运算,将结果赋值给obj3。最后,我们调用obj3的display()函数来显示结果。

这样,我们就成功地将"-"运算符重载实现为类的友元函数。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台(IoT Hub):https://cloud.tencent.com/product/iothub
  • 腾讯云移动开发:https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云游戏多媒体引擎(GME):https://cloud.tencent.com/product/gme
  • 腾讯云音视频处理(MPS):https://cloud.tencent.com/product/mps
  • 腾讯云安全产品:https://cloud.tencent.com/product/security
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

运算符成员函数函数重载

本文只介绍一下运算符重载两种方式,成员函数重载函数重载,并不具体到某些运算符具体案例。...+函数 // 此句等同于 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...x << endl; cout << “_y = “ << _y << endl; } private: int _x; int _y; }; // 函数实现,与成员函数不同是,this变成了

23940

运算符重载之何时重载为成员函数?何时重载函数

重载为成员函数: 一般情况下,当一运算符操作数,或者二运算符左操作数是该类一个对象时 。...函数原型为:名&名::operator运算符(变量表) 例如:用重载函数实现字符串连接(重载运算符“+”) 在这里插入代码片 #include “pch.h” #include #include...函数原型为:friend 名 operator运算符(变量表) 注意:函数声明与定义是分开,不可同时进行 例如:复数加法运算 在这里插入代码片 #include “pch.h”...int main() { Complex c, c1(1, 2); c = c1 + 1; c.gets(); } ** 一般情况下,运算符都可重载为成员函数函数,它们关键区别在于,成员函数具有...但在C++中不能,下列运算符不能重载函数: = () [ ] ->*

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

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

    26110

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

    一般来说,C++运算符重载可采用成员函数函数,二者都可以访问私有成员,那么该采用哪一种呢?首先看一下二者区别。...(2)当重载为成员函数时,只允许右参数隐式转换;当重载函数时,能够接受左参数和右参数隐式转换。...如果应用程序对效率要求较高,针对以上,建议选择定义多个运算符重载版本: CString& operator +(const CString&, const CString&); CString&...,最好将其重载函数;而对于单目运算符,则最好重载为成员函数。...有些双目运算符是不能重载函数,比如赋值运算符=、函数调用运算符()、下标运算符[]、指针运算符->等,因为这些运算符在语义上与this都有太多关联。

    2.5K20

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

    operate+(Student& s1, Student& s2) 最后 , 实现函数体 , 编写具体运算符操作业务逻辑 ; 2、运算符重载 下面以 Student 为例 , 编写 成员函数...二、函数实现运算符重载 1、函数实现运算符重载 如果类中成员都是私有成员 , 在 运算符重载 中 , 需要访问 私有成员 进行计算 , 在 成员函数 中 , 可以正常访问 私有成员 , 但是...在 全局函数 中 , 就无法访问 私有成员 了 ; 此时就需要将 全局函数 声明为 函数 , 这样才能再 该 全局函数 ( 函数 ) 中访问 私有成员 ; 成员变量 是 私有成员...+ s2.age, s1.height + s2.height); return student; }; 需要将 全局函数 声明为 函数 , 此时 使用 全局函数 实现 运算符重载 正常执行 ;...private: friend Student operator+(Student& s1, Student& s2); 2、代码示例 - 函数实现运算符重载 代码示例 : #include "

    18240

    C++this指针,静态成员,函数

    函数 所谓函数,就是在中,用friend关键字声明一个函数,这个函数声明在中,但不作为成员函数,虽然函数不属于成员函数,却可以访问成员,不论成员是public,pirvate...对于函数,放在public和private,或者是protected,都是可以。...:在实现之间数据共享时,减少系统开销,提高效率,具体来说:为了使其他成员函数直接访问该类私有变量,同时也破坏了封装性,所以不到万不得已,还是不要用友函数。...因为是需要来共享数据,那么大多数情况,函数都是有参数, 因为函数没有this指针,则参数要有三种情况: 要访问非static成员时,需要对象做参数; 要访问static成员或全局变量时...,则不需要对象做参数 如果做参数对象是全局对象,则不需要对象做参数 至于,也是一样。

    1.5K10

    C++函数使用

    1.介绍 在C++中,(friend)是一种机制,允许某个函数访问其他私有成员。通过,可以授予其他函数对该类私有成员访问权限。...2. (Friend Class): 可以一个声明为另一个。这样,在被声明为中,就可以直接访问另一个私有成员。...    } }; 3.函数 函数(Friend Function) 可以一个函数声明为一个函数。...当某个需要提供特定函数或操作给其他使用,但这些函数需要访问私有成员时,可以使用函数。 在重载运算符或实现某些特定功能时,可以提供对私有成员直接访问。...但是,有时需要定义一些函数,这些函数不是一部分,但又需要频繁地访问数据成员,这时可以这些函数定义为该函数函数。除了函数外,还有,两者统称为

    34040

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

    运算符(参数表); 成员函数定义格式: 函数类型 名::operator 运算符(参数表) { 函数体; } 三、非成员函数重载 函数原型格式: friend...函数类型 operator 运算符(参数表); 函数定义格式: 函数类型 名::operator 运算符(参数表) { 函数体; } 四、运算符重载原则 运算符重载不允许发明新运算符...*fp)(5); // 这么用,相当于调用obj.func(5); 一般情况下,单目运算符最好重载成员函数;双目运算符则最好重载函数。...以下一些双目运算符不能重载函数:=、()、[]、->。...类型转换运算符只能以成员函数方式重载(见这里) 流运算符只能以方式重载(见这里) #ifndef _COMPLEX_H_ #define _COMPLEX_H_ class Complex

    95900

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

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

    77750

    【C++】运算符重载 ② ( 内部定义云算符重载 - 成员函数 | 外部定义运算符重载 - 全局函数 | 可重载运算符 )

    一、运算符重载本质 运算符重载本质是 " 函数调用 " ; 当使用 + 个对象相加时 , C++ 编译器会查找是否有定义运算符重载函数 ; // 自定义类型相加 Student s1(10,...120), s2(18, 170); Student s3, s4, s5; // 运算符重载 s5 = s1 + s2; 如果找到了 运算符重载 函数 , 就会执行该函数内容 , 2...二、运算符重载语法 - 内部定义云算符重载 ( 成员函数 ) 1、运算符重载函数语法说明 C++ 中允许重新定义运算符行为 , 如常用加减成熟运算符 , 都可以进行重载操作 ; 可以自定义运算符操作..., 可以使用函数形式调用 , 也可以使用运算符进行运算 , 其 本质还是函数调用 ; 2、运算符重载函数调用 重载运算符完整调用 , 即调用上面定义整个 operator+ 方法 , 这是采用正式函数调用方式...: 90 三、运算符重载语法 - 外部定义运算符重载 ( 全局函数 ) ---- 1、运算符重载函数语法说明 外部定义运算符重载 , 运算符重载也可以定义在外部 , 可以是任意包含头文件代码中

    24310

    【C++】泛型编程 ⑨ ( 模板运算符重载 - 函数声明 和 函数实现 写在同一个中 | 模板 外部函数问题 )

    + 函数引入 如果要在 模板 中进行运算符重载 , 就需要用到函数 ; 如果 模板 函数实现 , 定义在函数外部 , 结合 函数 使用 , 就变得很复杂 , 下面针对该问题进行讨论...; 二、普通运算符重载 - 函数声明 和 函数实现 写在同一个中 下面的是一个 普通 , 其中定义了 成员变量 和 成员方法 ; 并为其重载了 左移运算符 和 加法运算符 ; 其中 加法运算符...重载 是在 内部实现 , 左移运算符 重载 是在外部 通过函数实现 , 因为左移运算符 左操作数是 ostream& 类型 , 如果定义在了 内部 , 左操作数就默认为当前 ; 代码示例...三、模板运算符重载 - 函数声明 和 函数实现 写在同一个中 1、模板 外部函数问题 将上述 " 普通运算符重载 - 函数声明 和 函数实现 写在同一个中 " 示例改造成 模板...示例 ; 问题就出现在 定义在外部 函数 中 , 函数 , 不能 读取 和 访问 到 泛型类型 T , 也就是 模板 中 template 泛型类型 T ; 在外部重新定义

    25810

    【c++】和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、、内部类、匿名对象)

    前言 之前我们学习了一些默认成员函数:构造函数、析构函数、拷贝构造函数、赋值重载。今天,我们接着学习剩下取地址运算符重载以及其他关于和对象知识。...一、取地址运算符重载 取地址运算符重载分为两种:普通对象取地址重载和const对象取地址重载。为了说明这两种取地址重载区别,我们首先引入一个概念:const修饰成员函数。...可以分为函数,我们需要使用友时,在函数声明之前加上关键字 friend ,并将其放在另一个(宿主)当中。此时该函数就成为了宿主。...函数特点如下: 1. 函数只是一种声明,并不是说一个函数成为了一个,他就是该类成员函数了。 2. 函数可以在任意地方声明,并不受public等限定符限制。...一个函数可以称为多个。 4. 成员函数都可以访问宿主成员,不受限定符限制。 5.

    10510

    【C++】泛型编程 ⑩ ( 模板运算符重载 - 函数实现 写在外部同一个 cpp 代码中 | 模板 外部函数二次编译问题 )

    ( 模板运算符重载 - 函数声明 和 函数实现 写在同一个中 | 模板 外部函数问题 ) 实现了第一种情况 , 模板 函数声明 与 函数实现 都写在同一个中 , 也就是没有分开进行编码...T> class Student { public: Student(T x, T y); } 2、模板 外部 实现 普通函数 内部 普通函数 实现 加法运算符重载 函数 , 提取到 模板...外部 实现 函数 函数 不是 函数 , 是 外部函数 , 函数 中又用到了 泛型 T , 说明这是一个 模板函数 ; 函数 是 全局函数 , 不属于 模板 , 不要使用 域操作符..., 只有在 重载 左移 右移 操作符时 , 才使用 函数 ; ( 1 ) 错误示例及分析 - 模板 外部函数 二次编译 问题 在 模板 内部声明 函数 , template <typename...函数 保持不变 ; // Student 函数 // 左移运算符重载 函数 template ostream& operator<<(ostream& out, Student

    21210

    C++(运算符重载+赋值拷贝函数+日期书写)

    运算符重载 C++为了增强代码可读性引入了运算符重载运算符重载是具有特殊函数函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通函数类似。...注意: 不能通过连接其他符号来创建新操作符:比如operator@ 重载操作符必须有一个类型参数 用于内置类型运算符,其含义不能改变,例如:内置整型+,不 能改变其含义 作为成员函数重载时,其形参看起来比操作数数目少..._day; } 可以看见如果写成全局函数,我们必须将成员变量改成共有的,所以我们可以运算符重载函数写成成员函数 代码展示 bool operator==(const Date& d2) {...既然编译器生成默认赋值运算符重载函数已经可以完成字节序值拷贝了,还需要自己 现吗?当然像日期这样是没必要。那么下面的呢?验证一下试试? // 这里会发现下面的程序会崩溃掉?...namespace std; class Date { //函数声明 friend ostream& operator<<(ostream& out, const Date& d); friend

    6210

    C++ 运算符重载基本概念

    — 2 — 运算符重载形式 运算符重载实质就是函数重载,可以重载为普通函数,也可以重载为成员函数。...运算符重载基本形式如下: 返回值类型 operator 运算符(形参表) { ... } 下面举个例子,实现对复数对象+和-运算符重载: class Complex // 复数 { public...+号普通函数,定义成函数 // 目的是为了函数能访问对象私有成员 friend Complex operator+(const Complex &a, const Complex...&b); private: double m_real; // 值 double m_imag; // 虚部值 }; // 重载+号运算符,属于普通函数,不是对象成员函数 Complex...如:c = a + b; 等价于c = operator+(a,b) 在上面的代码中,我把重载+号运算符普通函数,在Complex复数中定义成了函数,目的是为了函数能访问对象私有成员,否则会编译报错

    1K40

    运算符重载基本规则和习惯用法是什

    主要基于以下几点准则: 如果是一运算符,就实现为成员函数。 如果是二运算符,且不会修改其左右操作数,则实现为非成员函数。...还有,对于嵌套在模板中模板,operator<() 作为内联成员函数会更方便去读写成员变量,但这种情况不是经常能遇到。 普通运算符重载用法 重载运算符大部分代码都是固定。...,所以实现为函数最佳。...函数调用运算符使得可以像调用普通函数一样去调用一个实例,必须实现为成员函数。...如果有getXXX()这一函数,那么设其为非成员函数就没什么问题;如果没有,设置为最佳,这样就可以直接访问私有成员。 || && 用法和上面的一样,但是应用场景很难遇到需要重载这两个

    74010

    C++笔记:运算符重载

    同样,可对“+”运算符进行重载,实现两个对象加法运算。 运算符重载 运算符重载是通过定义函数实现,这种函数称为运算符重载函数,它通常是成员函数或者函数。...) 运算符重载和方法 成员函数作为运算符重载函数 函数作为运算符重载函数 class Complex //复数 { public: //使用成员函数重载运算符+ Complex...双目运算符重载函数时,形参表列中必须有两个参数,形参顺序任意。...重载双目运算符 例: 声明一个复数Complex,有部和虚部组成,重载运算符“+” “-” “+=”,“-=” ,实现复数相应运算。...具有自赋值运算符建议重载为成员函数 += -= /= *= &= |= ~= %= >>= <<= 其他二运算符建议重载函数 + - * / > < ==

    1.3K20

    关于C++中操作符重载疑问 :四个运算符=, ->, [], ()不可以重载为全局函数函数

    现在先说说赋值运算符“=”重载 C++规定赋值运算符“=”只能重载非静态成员函数,而不可以重载函数。...那么为什么赋值运算符不可以重载函数?像同样都是双目运算符+为什么它就可以呢?...程序是不允许有矛盾不确定选择,所以当赋值运算符重载函数时,编译器就会提示错误。 对于剩下3个运算符 ->, [], () 为什么不能重载函数,也是跟上面一样道理。...A函数时,程序就会出现跟把赋值运算符重载一样情况,即产生矛盾性。...总结来说,这几个运算符不能重载函数原因就是,C++一个本身对这几个运算符已经有相应解释了。

    1K20
    领券