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

无需使用成员函数和友元函数即可实现运算符重载

运算符重载是一种特殊的函数重载,它允许我们对已有的运算符进行重新定义,以适应特定的数据类型或对象。在C++中,运算符重载可以通过成员函数或友元函数来实现。然而,根据题目要求,我们需要在不使用成员函数和友元函数的情况下实现运算符重载。

在C++中,运算符重载可以通过全局函数来实现。全局函数是定义在类外部的普通函数,它可以访问类的私有成员。因此,我们可以通过定义全局函数来重载运算符,而无需使用成员函数或友元函数。

下面是一个示例,演示了如何在不使用成员函数和友元函数的情况下实现运算符重载:

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

class MyNumber {
private:
    int value;

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

    int getValue() const {
        return value;
    }
};

// 重载加法运算符
MyNumber operator+(const MyNumber& num1, const MyNumber& num2) {
    int sum = num1.getValue() + num2.getValue();
    return MyNumber(sum);
}

int main() {
    MyNumber num1(5);
    MyNumber num2(10);

    MyNumber sum = num1 + num2;
    std::cout << "Sum: " << sum.getValue() << std::endl;

    return 0;
}

在上面的示例中,我们定义了一个名为MyNumber的类,它包含一个私有成员变量value和一个公有成员函数getValue()。然后,我们通过定义全局函数operator+来重载加法运算符。该函数接受两个MyNumber对象作为参数,并返回一个新的MyNumber对象,其值为两个对象的值之和。

main()函数中,我们创建了两个MyNumber对象num1num2,并使用+运算符将它们相加。最后,我们输出了结果。

需要注意的是,这只是一个简单的示例,用于演示如何在不使用成员函数和友元函数的情况下实现运算符重载。在实际应用中,根据具体的需求和情况,可能需要更复杂的实现方式。

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

相关·内容

运算符成员函数函数重载

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

20540

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

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

2.2K20

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

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

57030

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

实现 运算符重载 使用 全局函数 实现 运算符重载 , 重载 + 运算符 ; 全局函数 实现 运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符 ,...实现 运算符重载 使用 成员函数 实现 运算符重载 , 重载 - 运算符 ; 成员函数 实现 运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符 ,...二、函数实现运算符重载 1、函数实现运算符重载 如果类中的成员都是私有成员 , 在 运算符重载 中 , 需要访问 私有成员 进行计算 , 在 成员函数 中 , 可以正常访问 私有成员 , 但是...在 全局函数 中 , 就无法访问 私有成员 了 ; 此时就需要将 全局函数 声明为 类的 函数 , 这样才能再 该 全局函数 ( 函数 ) 中访问 私有成员 ; 类中的 成员变量 是 私有成员...+ s2.age, s1.height + s2.height); return student; }; 需要将 全局函数 声明为 函数 , 此时 使用 全局函数 实现 运算符重载 正常执行 ;

15140

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

一、左移运算符重载 1、函数 / 成员函数 实现运算符重载 运算符重载 的正规写法一般都是 使用 成员函数 的形式 实现的 ; 加法 + , 减法 - , 自增 ++ , 自减 - - , 一般都使用成员函数...实现 运算符重载 ; 上述 运算符重载 既可以使用 成员函数 进行重载 , 又可以使用函数进行重载 ; 只能使用 成员函数 重载运算符 : = , [] , () , -> 等操作符 只能使用...成员函数 进行重载 ; 只能使用 函数 重载运算符 : 无法修改 左操作数 的情况下 , 只能使用 全局函数 ( 需声明 函数 ) 进行重载 ; 2、类对象 使用 左移运算符 平时使用 cout...(或没有可接受的转换) 如果想要使用 cout << s1 << endl; 用法输出对象到日志中 , 需要重载 左移操作符 ; 3、左移运算符 << 重载 使用 全局函数 实现 左移运算符 << 重载..., 编写具体的运算符操作业务逻辑 ; // 全局函数实现 Student 左移运算符重载 // 返回 ostream& 引用类型 , 是为了支持链式调用 cout << s1 << endl; ostream

19710

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

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

92730

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

一、一运算符重载 1、使用 成员函数 实现 前置 ++ 自增运算符重载 使用 全局函数 实现 前置 ++ 自增运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符..., 编写具体的运算符操作业务逻辑 ; // 使用 成员函数 实现 前置 ++ 自增运算符重载 // 重载 前置 ++ 运算符 // 实现 1 个 Student 对象 自增运算 // 由于 参数中的...成员函数 实现 前置 - - 自减运算符重载 使用 全局函数 实现 前置 - - 自减运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符 , 函数名是..., 编写具体的运算符操作业务逻辑 ; // 使用 成员函数 实现 前置 -- 自减运算符重载 // 重载 前置 -- 运算符 // 实现 1 个 Student 对象 自增运算 // 由于 参数中的...成员函数 实现 前置 ++ 自增运算符重载 // 重载 前置 ++ 运算符 // 实现 1 个 Student 对象 自增运算 // 由于 参数中的 Student& s 中的属性发生了变化

15240

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

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

91600

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

全局函数 实现 后置 ++ 自增运算符重载 使用 全局函数 实现 后置 ++ 自增运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符 , 函数名是 operate..., 编写具体的运算符操作业务逻辑 ; // 使用 全局函数 实现 后置 ++ 自增运算符重载 // 重载 后置 ++ 运算符 // 实现 1 个 Student 对象 自增运算 // 先使用 参数中的...成员函数 实现 后置 – 自减运算符重载 使用 成员函数 实现 后置 – 自减运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符 , 函数名是 operate...; public: // 使用 成员函数 实现 后置 -- 自减运算符重载 // 重载 后置 -- 运算符 // 实现 1 个 Student 对象 自减运算 // 先使用 this 指针指向的对象...成员函数 实现 后置 -- 自减运算符重载 // 重载 后置 -- 运算符 // 实现 1 个 Student 对象 自减运算 // 先使用 this 指针指向的对象 , 再自减 // 因此

16540

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

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

50720

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

一、一运算符重载 1、一运算符列举 一运算符 : 又称为 单目运算符 取反运算符 : - 解引用运算符 : * 取地址运算符 : & 自增运算符 : ++ , 该运算符分为 前置 后置 两种类型...; 自减运算符 : – , 该运算符分为 前置 后置 两种类型 ; 2、为下面的类实现运算符重载操作 本博客中 , 为下面的 Student 类实现运算符 重载操作 ; class Student...Student 类的私有成员 , 需要将该全局函数声明为 函数 ; // 使用 全局函数 实现 前置 ++ 自增运算符重载 friend Student& operator++(Student...Student 类的私有成员 , 需要将该全局函数声明为 函数 ; // 使用 全局函数 实现 前置 -- 自增运算符重载 friend Student& operator--(Student...(this->age - s.age, this->height - s.height); return student; }; private: // 函数 实现 全局函数 运算符重载

15620

C++函数类的使用

关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。 可以分为两种类型:类函数。...: 当两个或多个类需要共享私有数据时,可以使用实现数据的直接访问,而无需通过公有接口。...当某个类需要提供特定函数或操作给其他类使用,但这些函数需要访问类的私有成员时,可以使用函数。 在重载运算符实现某些特定功能时,可以提供对类私有成员的直接访问。...示例2: 分别定义一个类A类B ,各有一个私有整数成员变量通过构造函数初始化;类A有一个成员函数Show(B &b)用来打印AB的私有成员变量,请分别通过函数类来实现此功能。...使用 函数实现: #include using namespace std; class B; class A; void Show( A& , B& );

25440

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

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

75650

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

以String类为例实现成员函数 class String { //函数重载运算符 friend ostream& operator>(istream& in, String& str); public: //通用构造函数 String(const char* str) {...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

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

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

20010

【C++】泛型编程 ⑬ ( 类模板示例 - 数组类模板 | 构造函数析构函数 的 声明与实现 | 普通成员函数 的 声明与实现 | 外部函数 的 声明与实现 )

; 左移 << 运算符重载 , 用于向 cout 中输出字符 , 打印数据到命令行 ; 需要使用 函数 在外部实现 ; 下标 [] 运算符重载 , 用于读取 数组中的数据 ; 等号 = 运算符重载..." << endl; } 3、普通成员函数 的 声明与实现 重载 数组下标 [] 操作符 , 使用 类模板内部 的 成员函数即可完成 ; 普通成员函数 的 声明 : 数组下标 运算符 重载 , 返回值是一个...[i]; } 4、外部函数 的 声明与实现 重载 左移 << 操作符 , 由于 左移操作符的 做操作数是 cout 是 ostream 引用类型的 , 右操作数是 数组本身类型引用 , 返回值是 ostream...引用类型 以便可以进行链式调用 ; 因此 , 该 左移 << 操作符 不能在 类模板 内部定义 , 类模板内部定义的 操作符重载函数 , 其 左操作数 必须是 类本身 ; 外部函数 的 声明 :... friend ostream& operator (ostream& out, const Array& a); } 外部函数实现 : 在外部 实现 类模板的 函数

37610

CC++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)

运算符函数重载一般有两种形式:重载为类的成员函数重载为类的非成员函数。非成员函数通常是。(可以把一个运算符作为一个非成员、非函数重载。...两种重载形式的比较   在多数情况下,将运算符重载为类的成员函数类的函数都是可以的。...但成员函数运算符函数运算符也具有各自的一些特点: (1) 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的函数。...如果左边的操作数必须是一个不同类的对象,或者是一个内部 类型的对象,该运算符函数必须作为一个函数实现。 (7) 当需要重载运算符具有可交换性时,选择重载函数。...下面具体讲讲重载运算符的一些具体用法吧! 1.一般运算符重载 在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数函数

1.9K61

EasyC++66,函数

通过让函数成为类的,可以赋予该函数与类成员函数一样的访问权限,也就是说我们可以在函数当中访问类的私有成员变量。 在介绍函数使用之前,我们需要先了解为什么需要函数。...C++ Primer中给了一个非常不错的例子,在之前运算符重载的例子当中,我们实现了一个类Time。用来记录时间,假设我们需要重载它的*运算符,能够允许一个时间对象一个浮点数相乘。...很明显,我们只需要重载运算符*即可: Time Time::operator*(const double x) { // todo } 我们在使用的时候大概是这样: Time a, b; a...friend Time operator*(double m, const Time &t); 它有两个含义: 它不是成员函数,因此不能使用成员函数运算符来调用 它与成员函数的访问权限相同,即可以访问所有...privatepublic数据 由于函数不是成员函数,所有我们在实现的时候不需要使用Time::限定符,也不用在实现当中加上关键字friend,函数实现如下: Time operator*(double

23410

【C++初阶】类与对象:6大默认成员函数------拷贝构造赋值运算符重载

operator操作符(参数列表); 运算符重载函数的调用一般的函数也是一样的,只不过运算符重载函数名有点特殊而已。...4.作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐 藏的this; 5.    .*   ::     sizeof     ?...3.返回*this :要符合连续赋值的含义; 注意: 赋值运算符只能重载成类的成员函数不能重载成全局函数,因为重载成全局的,类里面又会自动生成一个,这样编译器就无法分辨; 如果没有显示定义赋值运算符重载...,那么会自动生成的赋值运算符重载,这拷贝构造函数类似: 1.对内置类型完成浅拷贝; 2.对自定义类型会去调用它的赋值运算符重载函数 下面是日期类的赋值运算符重载: Date& operator...四.区分拷贝构造赋值运算符重载 1.当我们用一个已经存在对象去初始化另一个对象时,即使写的是 “ = ” ,此时也调用它的拷贝构造函数; 2.已经存在的两个对象之间赋值拷贝,此时是赋值运算符重载

11810

运算符重载

运算符重载 函数 函数是定义在类外部,但有权访问类的所有私有(private)成员保护(protected)成员。...尽管函数的原型有在类的定义中出现过,但是函数并不是成员函数。...重载运算符可以使用成员函数或非成员函数(一般是函数)两种方法 只能使用其中的一种方法 关键字operator 类名 operator运算符(const 类名& other);//成员函数实现 Complex...Complex operator++(); //前++运算符重载 成员函数实现 Complex operator++(int); //后++运算符重载通过哑实现 成员函数实现...流操作符>>,<<重载 cout是输出类的对象,而cin是输入类的对象,C++头文件iostream取自istreamostream之意 流操作符>>,<<一般使用成员函数实现,也就是函数实现

92060
领券