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

23940

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

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

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

    重载成员函数: 一般情况下,当一运算符的操作数,或者二运算符的左操作数是该类的一个对象时 。...函数原型为:类名&类名::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++中不能,下列运算符不能重载函数: = () [ ] ->*

    58930

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

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

    18240

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

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

    26010

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

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

    1K30

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

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

    18140

    从零开始学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+ 运算符重载,可以是成员函数形式,也可以是形式,如果两者共存的话成员函数优先

    95900

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

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

    52720

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

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

    19140

    【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: // 函数 实现 全局函数 运算符重载

    18820

    C++函数类的使用

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

    33740

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

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

    77750

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

    前言 之前我们学习了类中的一些默认成员函数:构造函数、析构函数、拷贝构造函数、赋值重载。今天,我们接着学习剩下的取地址运算符重载以及其他关于类对象的知识。...一、取地址运算符重载 取地址运算符重载分为两种:普通对象的取地址重载const对象取地址重载。为了说明这两种取地址重载的区别,我们首先引入一个概念:const修饰成员函数。...可以分为函数类,我们需要使用时,在函数或类的声明之前加上关键字 friend ,并将其放在另一个类(宿主类)当中。此时该函数或类就成为了宿主类的。...函数类的特点如下: 1. 函数只是一种声明,并不是说一个函数成为了一个类的,他就是该类的成员函数了。 2. 函数可以在类的任意地方声明,并不受public等限定符的限制。...总结 今天我们学习了类对象相关的新概念知识,例如:取地址重载、static修饰成员、内部类等,它们对于我们深入学习并理解c++的后续内容,以及实现对象的相关功能有很大帮助。

    10410

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

    以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++】类对象(中):类的默认成员函数,构造函数、析构函数、拷贝构造函数运算符重载

    一个类,我们在不写的情况下编译器会默认生成6个默认成员函数(C++11后还增加了两个默认成员函数,新增的后面再说),重点学习前四个,后两个稍微了解即可。...所以使用时要注意,确保返回的对象在当前函数结束后还在,再使用。 5.运算符重载 运算符被用于类类型时,C++允许我们通过运算符重载的形式指定新的含义。...1.运算符重载其实是一个具有特殊名字的函数,它的名字由operator后面要定义的运算符共同组成。其他函数一样,它也具有返回类型参数列表以及函数体。...friend bool operator==(Date d1, Date d2); 函数我们后面再详细说。运算符重载我们建议还是写成成员函数。...5.2 取地址运算符重载 取地址运算符重载分为普通取地址运算符重载const取地址运算符重载,一般这两个函数编译器自动生成的就可以够我们用了,不需要去显示实现

    8910

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

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

    25810

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

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

    46810

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

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

    2.4K61

    【C++篇】C++类对象实践篇——从零带你实现日期类的超详细指南

    为了实现 Date 类的输出重载,我们可以将其声明为函数,使得它能够访问 Date 类的私有成员变量。 思考: 为什么我们推荐使用函数重载流插入与流提取运算符?...5.4 为什么推荐 << 运算符重载函数? 为什么 << 运算符重载时更推荐函数呢?接下来,我们逐步分析三种实现方式的差异,并解释函数的优势。...5.4.1 三种实现方式的对比 我们可以通过三种方式来重载 << 运算符函数:它可以访问 Date 类的私有成员,但不属于 Date 类的成员。...5.4.3.2 访问私有成员 函数可以直接访问 Date 类的私有成员无需通过 getter 函数。这不仅保持了类的封装性,还简化了代码结构。...封装性:函数可以直接访问 Date 类的私有成员无需暴露内部实现,保持封装性。 通用性:函数更灵活,可以用于多种类型的输入输出流。 6.

    8210
    领券