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

如何在c ++中定义友元函数和运算符重载

在C++中,友元函数和运算符重载是两个不同的概念,但它们都可以访问类的私有成员。

  1. 友元函数:

友元函数是一个函数,它可以访问类的私有成员,但它不是类的成员。要声明一个友元函数,需要在类定义中使用friend关键字,并且指定函数的原型。

例如,假设有一个名为MyClass的类,其中有一个私有成员x,我们可以声明一个友元函数printX来访问x

代码语言:cpp
复制
class MyClass {
    int x;
    friend void printX(MyClass obj);
};

void printX(MyClass obj) {
    cout << "x: "<< obj.x<< endl;
}

在这个例子中,printX函数是一个友元函数,它可以访问MyClass的私有成员x

  1. 运算符重载:

运算符重载是一种让运算符可以操作用户自定义的数据类型的技术。在C++中,可以通过重载运算符来实现对自定义数据类型的操作。

例如,假设有一个名为MyClass的类,我们可以重载+运算符来实现两个MyClass对象的加法:

代码语言:cpp
复制
class MyClass {
    int x;
public:
    MyClass(int a) : x(a) {}
    MyClass operator+(const MyClass& obj) {
        return MyClass(x + obj.x);
    }
};

在这个例子中,operator+函数是一个重载的运算符,它可以将两个MyClass对象相加,并返回一个新的MyClass对象。

总之,友元函数和运算符重载都是C++中的重要概念,它们可以帮助开发人员更好地控制类的访问权限和实现自定义的操作。

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

相关·内容

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

运算符重载的我们需要坚持四项基本原则: (1)不可臆造运算符; (2)运算符原有操作数的个数、优先级结合性不能改变; (3)操作数至少一个是自定义类型; (4)保持重载运算符的自然含义...一般来说,C++运算符重载可采用成员函数函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。...(1)当重载为成员函数时,会隐含一个this指针;当重载函数时,不存在隐含的this指针,需要在参数列表显示地添加操作数。...(2)当重载为成员函数时,只允许右参数的隐式转换;当重载函数时,能够接受左参数右参数的隐式转换。...,最好将其重载函数;而对于单目运算符,则最好重载为成员函数

2.5K20

运算符成员函数函数重载

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

23840
  • 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 "

    18240

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

    重载为成员函数: 一般情况下,当一运算符的操作数,或者二运算符的左操作数是该类的一个对象时 。...=” << obj2.gets() << endl; cout << “obj2.len=” << obj2.getLen() << endl; } 重载函数运算符的左、右操作数类型不同时。...函数原型为:friend 类名 operator运算符(变量表) 注意:函数在类的声明与定义是分开的,不可同时进行 例如:复数的加法运算 在这里插入代码片 #include “pch.h”...(1, 2); c = c1 + 1; c.gets(); } ** 一般情况下,运算符都可重载为成员函数函数,它们的关键区别在于,成员函数具有this 指针,而函数没有this指针。...但在C++不能,下列运算符不能重载函数: = () [ ] ->*

    58930

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

    一、左移运算符重载 1、函数 / 成员函数 实现运算符重载 运算符重载 的正规写法一般都是 使用 成员函数 的形式 实现的 ; 加法 + , 减法 - , 自增 ++ , 自减 - - , 一般都使用成员函数...实现 运算符重载 ; 上述 运算符重载 既可以使用 成员函数 进行重载 , 又可以使用友函数进行重载 ; 只能使用 成员函数 重载运算符 : = , [] , () , -> 等操作符 只能使用...成员函数 进行重载 ; 只能使用 函数 重载运算符 : 无法修改 左操作数 的情况下 , 只能使用 全局函数 ( 需声明 函数 ) 进行重载 ; 2、类对象 使用 左移运算符 平时使用 cout...与 左移操作符 << 向命令行输出数据时 , 只能输出 基础数据类型 字符串 ; cout << "age = " << age << endl; 如果 , 想要输出 自<em>定义</em>类对象 , 直接使用下面的代码...: error <em>C</em>2679: 二进制“<<”: 没有找到接受“Student”类型的右操作数的<em>运算符</em>(或没有可接受的转换) 如果想要使用 cout << s1 << endl; 用法输出对象到日志<em>中</em>

    25810

    C++函数

    函数 C++可以通过使用关键词friend在一个类内声明一个全局非类内成员函数作为自己的函数,给予它高度的访问权限,允许这个函数访问自己类内所有成员(包括私有成员)。...我们先定义一个Circle类作为例子,这个类声明了全局函数Area是自己的函数: class Circle { public: friend int Area(Circle &); private...需要注意的是必须先声明类,再定义作为函数的全局函数,不然系统会说找不到Circle。...还有就是声明另一个类的成员函数函数时要加上类名作用域运算符。 ...还是我们的Point类Circle类,稍作修改一下: class Circle; class Point { friend Circle; }; 注意 函数是单向的,我把你当作朋友,但在你的心里

    17820

    C++函数

    C++ ,一个类可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类函数可以访问本类的 private 成员。...现在,我们来介绍一种例外情况——(friend)。 借助(friend),可以使得其他类的成员函数以及全局范围内的函数访问当前类的 private 成员。...在 C++ ,这种友好关系可以用 friend 关键字指明,中文多译为“”,借助可以访问与其有好友关系的类的私有成员。...如果你对“”这个名词不习惯,可以按原文 friend 理解为朋友。 函数 在当前类以外定义的、不属于当前类的函数也可以在类声明,但要在前面加 friend 关键字,这样就构成了函数。...函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数函数可以访问当前类的所有成员,包括 public、protected、private 属性的。

    18350

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

    一、运算符重载 运算符重载允许把标准运算符+、-、*、/、等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性 运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式...运算符(参数表); 成员函数定义的格式: 函数类型 类名::operator 运算符(参数表) { 函数体; } 三、非成员函数重载 函数原型的格式: friend...函数类型 operator 运算符(参数表); 函数定义的格式: 函数类型 类名::operator 运算符(参数表) { 函数体; } 四、运算符重载的原则 运算符重载不允许发明新的运算符...*fp)(5); // 这么用,相当于调用obj.func(5); 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的函数。...以下一些双目运算符不能重载为类的函数:=、()、[]、->。

    95900

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

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

    77750

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

    运算符重载,我们需要坚持四项基本原则: (1)不可臆造运算符; (2)运算符原有操作数的个数、优先级结合性不能改变; (3)操作数至少一个是自定义类型; (4)保持重载运算符的自然含义。...一般来说,C++ 运算符重载可采用成员函数函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。...当重载为成员函数时,会隐含一个 this 指针;当重载函数时,不存在隐含的 this 指针,需要在参数列表显示添加操作数。...当重载为成员函数时,只允许右参数的隐式转换;当重载函数时,能够接受左参数右参数的隐式转换。...,最好将其重载函数;而对于单目运算符,则最好重载为成员函数

    1K30

    C++运算符重载函数重载

    运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。...C++函数重载 在同一个作用域内,可以声明几个功能类似的函数,但这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。不能仅仅通过函数返回类型的不同来重载函数。...C++运算符重载 运算符重载其实就是定义一个函数,在函数体内实现想要的功能,当用到该运算符时,编译器会自动调用这个函数。也就是说,运算符重载是通过函数实现的,它本质上是函数重载。...运算符重载的格式为: 返回值类型 operator 运算符名称 (形参表列){     //TODO: } operator是关键字,专门用于定义重载运算符函数。...我们可以将operator 运算符名称这一部分看做函数名。 下面看一个例子,以下代码定义了一个复数类,通过运算符重载,可以用+号实现复数的加法运算:

    72920

    C++函数类的使用

    1.介绍 在C++(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过,可以授予其他类或函数对该类的私有成员的访问权限。...当某个类需要提供特定函数或操作给其他类使用,但这些函数需要访问类的私有成员时,可以使用函数。 在重载运算符或实现某些特定功能时,可以提供对类私有成员的直接访问。...在C++,我们使用类对数据进行了隐藏封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。...但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数函数。除了函数外,还有类,两者统称为。...A类B ,各有一个私有整数成员变量通过构造函数初始化;类A有一个成员函数Show(B &b)用来打印AB的私有成员变量,请分别通过函数类来实现此功能。

    33640

    C++ 重载运算符重载函数

    C++ 重载运算符重载函数 C++ 允许在同一作用域中的某个函数 运算符 指定多个定义,分别称为函数重载 运算符重载。...当您调用一个重载函数重载运算符 时,编译器通过把您所使用的参数类型与定义的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数重载运算符的过程,称为重载决策。...(c); return 0; } 当上面的代码被编译执行时,它会产生下列结果: 整数为: 5 浮点数为: 500.263 字符串为: Hello C++ C++ 运算符重载 您可以重定义重载大部分...这样,您就能使用自定义类型的运算符重载运算符是带有特殊名称的函数函数名是由关键字 operator 其后要重载运算符符号构成的。与其他函数一样,重载运算符有一个返回类型一个参数列表。...序号 运算符实例 1 一运算符重载 2 二运算符重载 3 关系运算符重载 4 输入/输出运算符重载 5 ++ -- 运算符重载 6 赋值运算符重载 7 函数调用运算符 () 重载 8 下标运算符

    71010

    C++ 重载运算符重载函数

    C++ 允许在同一作用域中的某个函数运算符指定多个定义,分别称为函数重载运算符重载。...当您调用一个重载函数重载运算符时,编译器通过把您所使用的参数类型与定义的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数重载运算符的过程,称为重载决策。...C++ 函数重载在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。...}当上面的代码被编译执行时,它会产生下列结果:整数为: 5浮点数为: 500.263字符串为: Hello C++C++ 运算符重载您可以重定义重载大部分 C++ 内置的运算符。...这样,您就能使用自定义类型的运算符重载运算符是带有特殊名称的函数函数名是由关键字 operator 其后要重载运算符符号构成的。与其他函数一样,重载运算符有一个返回类型一个参数列表。

    2.1K30

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

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

    52720

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

    一、运算符重载本质 运算符重载的本质是 " 函数调用 " ; 当使用 + 将 个对象相加时 , C++ 编译器会查找是否有定义运算符重载函数 ; // 自定义类型相加 Student s1(10,...个对象执行加法操作 , 如果没有找到 运算符重载 函数 , 就会报错 ; 报错信息如下 : error C2676: 二进制“+”:“Student”不定义运算符或到预定义运算符可接收的类型的转换 1...二、运算符重载语法 - 类内部定义云算符重载 ( 成员函数 ) 1、运算符重载函数语法说明 C++ 中允许重新定义运算符的行为 , 如常用的加减成熟运算符 , 都可以进行重载操作 ; 可以自定义运算符的操作...参数外面的括号 () ; //+ 是在 Operator 类定义运算符重载 //其作用是返回一个对象 , 其number成员变量值是 o1 o2 number成员变量之和 Operator...//运算符重载简化写法 //+ 是在 Operator 类定义运算符重载 //其作用是返回一个对象 , 其number成员变量值是 o1 o2 number成员变量之和 Operator

    24210

    C++学习之路——函数重载运算符重载

    一、函数重载 C++允许在同一作用域中的某个函数运算符指定多个定义,分 别称为函数重载运算符重载 重载声明是指一个与之前已经在该作用域内声明过的函数或方法 具有相同名称的声明,但是它们的参数列表实现不相同...当您调用一个重载函数重载运算符时,编译器通过把您所使用的参数类型与定义的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数重载运算符的过程,称为重载决策。...C++函数重载 在同一个作用域内,可以声明几个功能类似的同名函数,但是这 些同名 函数的形式参数(指参数的个数、类型或者顺序)必须不同。 您不能仅通过返回类型的不同来重载函数。...下面的实例,同名函数 print() 被用于输出不同的数据类型: 二、运算符重载 重载运算符是带有特殊名称的函数函数名是由关键字 oper ator 其后要重载运算符符号构成的。...大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成 员函数

    41520

    从零开始学C++之友函数

    一、介绍 我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有保护成员。而类的外部函数只能访问类的公有成员。 是一种允许非类成员函数访问类的非公有成员的一种机制。...函数 类 二、函数 函数在类作用域外定义,但它需要在类体中进行说明 为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend  ...类型 函数名(参数表); 的作用在于提高程序的运行效率 函数注意事项: 1、函数不是类的成员函数,在函数访问对象的成员,必须用对象名加运算符“.”加对象成员名。...但函数可以访问类的所有成员(公有的、私有的、保护的),一般函数只能访问类的公有成员。 2、函数不受类的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。...参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

    74900

    C++】类 ( 类简介 | 类声明 | 类单向性 | 类继承性 | 类作用 | 函数由来 | Java 反射机制 | C C++ 编译过程 )

    一、类简介 1、类引入 在 C++ 语言中 , " 类 " 是 一个类 与 另外一个类 的 特殊类关系累 , 在 类 A 的 " 类 " B , 可以直接访问 A 类 的 私有成员...B 是 A 的 类 ; B 类定义 A 类型成员变量 ; B 可以访问 A 的 所有成员 , 包括 私有成员 或 受保护成员 ; B 可以看做 A 的 数据操作辅助类 ; 代码示例 : class...作为 某个类的 数据操作 辅助类 ; 作为 多个类 之间 传递信息 的 辅助类 ; 二、函数由来 1、函数引入 函数 会破坏 C++ 面向对象 的封装性 , 那么为什么还会出现该机制呢...有些编程场景 , 需要破坏类的封装性 , 需要访问类的私有属性 ; Java 给出的方案是 反射机制 ; C++ 给出的方案是 函数 类 ; 2、Java 反射机制 Java 类编译成...最终的 函数 都是汇编指令 , 机器码指令 , 如果要从指令查找指定的类的私有属性 , 该操作难度很大 ; 三、类代码示例 ---- 在 Student 类 , 定义类 StudentCaculate

    1.8K10

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

    上一篇博客 【C++】运算符重载 ⑥ ( 一运算符重载 | 后置运算符重载 | 前置运算符重载 与 后置运算符重载 的区别 | 后置运算符重载添加 int 占位参数 ) , 讲解了 前置运算符重载...全局函数 实现 后置 ++ 自增运算符重载 使用 全局函数 实现 后置 ++ 自增运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载运算符 , 函数名是 operate...++ ; operate++ 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ; 此处由于是一运算符重载 , 只需要对本对象进行操作 , 需要传入对象本身作为参数 , 另外为了与前置运算符作区分...-- 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ; 此处由于是一运算符重载 , 只需要对本对象进行操作 , 不需要将对象本身进行传入了 , 直接使用 this 指针操作对象...实现 前置 ++ 自增运算符重载 // 重载 前置 ++ 运算符 // 实现 1 个 Student 对象 自增运算 // 由于 参数的 Student& s 的属性发生了变化 // 返回时仍需要返回

    19140
    领券