首页
学习
活动
专区
工具
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变成了

22140

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

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

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

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

    23910

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

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

    2.3K20

    【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 "

    16740

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

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

    1.5K10

    C++函数使用

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

    31140

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

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

    94400

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

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

    77050

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

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

    22910

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

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

    23910

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

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

    19510

    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()这一函数,那么设其为非成员函数就没什么问题;如果没有,设置为最佳,这样就可以直接访问私有成员。 || && 用法和上面的一样,但是应用场景很难遇到需要重载这两个

    73510

    C++笔记:运算符重载

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

    1.1K20

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

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

    99020

    成员函数(构造、析构、拷贝构造、赋值、运算符重载)实现

    以String为例实现其成员函数 class String { //函数重载运算符 friend ostream& operator<<(ostream &out,String& str);...str) //对m_data加NULL判断 { length = 0; m_data = new char[1]; //对空字符串自动申请存放结束标志'\0'空 *m_data...inline size_t size() const { return length; } private: char* m_data; size_t length; }; //为什么要重载函数.../*如果是双目运算符,只要设置一个参数作为右侧运算量,左侧运算符就是对象this本身 *但是>>或<<左侧运算符是cin或cout而不是对象本身,只能声明为了 *如果一定要声明为成员函数,只能声明为...ostream & operator<<(ostream &output) *在运用这个<<运算符时就变为这种形式了:data<<cout;不合符人习惯。

    1.1K60

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

    图5-1 构造函数重载 5.1.3 哪些运算符可以重载? ?...图5-2 运算符重载 5.1.4 重载成员函数 重载运算符,不再显式说明参数 重载运算符,只显式说明一个参数;该参数为操作数右操作数,左操作数由this指针(指向调用该成员函数对象)提供...图5-3 重载成员函数 5.1.6 重载函数 重载函数时,没有隐含参数this指针,即不改变原有运算符语法结构 下列运算符不能重载函数:=、()、[]、-> 重载函数运算符重载函数格式...图5-4 重载函数 5.2 静态束定(静态联编) 静态联编是指联编工作在编译阶段完成,这种联编过程是在程序运行之前完成,又称为早期联编。...动态联编优点是灵活性强,但效率低 实现动态联编需要同时满足以下三个条件: 1必须把动态联编行为定义为函数 2之间应满足子类型关系,通常表现为一个从另一个公有派生而来 3必须先使用基指针指向子类型对象

    84330
    领券