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

当重载运算符是友好的时,成员不可访问

是指在类的重载运算符函数中,无法直接访问类的私有成员或受保护成员。友好的重载运算符函数是指在类内部声明为友元函数的重载运算符函数。

友好的重载运算符函数可以在类外部进行重载,使得类的对象可以像内置类型一样使用运算符。然而,由于友好的重载运算符函数是在类外部定义的,它无法直接访问类的私有成员或受保护成员。

为了在友好的重载运算符函数中访问类的私有成员或受保护成员,可以通过提供公有成员函数或友元函数来间接访问。这些函数可以在类内部定义,以便访问类的私有成员或受保护成员,并在友好的重载运算符函数中调用这些函数。

以下是一个示例,说明当重载运算符是友好的时,成员不可访问的情况:

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

class MyClass {
private:
    int value;

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

    // 友好的重载运算符函数
    friend MyClass operator+(const MyClass& lhs, const MyClass& rhs);

    // 公有成员函数,用于访问私有成员
    int getValue() const {
        return value;
    }
};

// 友好的重载运算符函数的实现
MyClass operator+(const MyClass& lhs, const MyClass& rhs) {
    // 无法直接访问类的私有成员value
    // 可以通过调用公有成员函数getValue()来访问
    int sum = lhs.getValue() + rhs.getValue();
    return MyClass(sum);
}

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

    MyClass result = obj1 + obj2;
    std::cout << "Sum: " << result.getValue() << std::endl;

    return 0;
}

在上述示例中,类MyClass中的私有成员value无法直接在友好的重载运算符函数operator+中访问。为了获取私有成员的值,定义了一个公有成员函数getValue(),并在operator+中调用该函数来获取私有成员的值。

这样,通过重载运算符+,我们可以对MyClass对象进行相加操作,并通过公有成员函数获取结果。在实际应用中,可以根据具体需求重载其他运算符,以实现类似的功能。

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

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

相关·内容

【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问私有指针成员 | 为指针分配指定大小内存并初始化 0 )

一、重载 左移 << 运算符 1、左移 << 运算符作用 左移运算符重载 , 可参考 【C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 / 成员函数 实现运算符重载 | 类对象 使用 左移运算符...<< 重载 : 首先 , 写出函数名 , cout << s1 左移操作符重载 , 函数名规则为 " operate " 后面跟上要重载运算符 , 函数名 operate<< ; operate<...将全局函数 声明为 String 友元函数 friend ostream& operator<<(ostream& out, String& s); } 二、自定义类使用技巧 ---- 1、直接访问私有指针成员...在开发中 , 自定义了一个 class 类 , 其中定义了 指针 类型 成员变量 ; 一般情况下 , 成员变量 都要 声明为 私有 private ; 如果要 直接使用 私有的指针变量 , 可以通过...s1 = s2; // 调用重载等号运算符函数, 右操作数 字符串常量值 , char* 指针类型 s3 = "Jerry"; // 调用重载下标运算符函数 char c = s3[3

15810

重载运算符操作说明(一)

运算符作用于内置类型运算对象,我们无法改变该运算符含义 例: int operator+(int , int);//错误,不能为int 重定义内置运算符 总结:只能重载已有的运算符,无权发布新运算符号...下面总结一些是否能被重载运算符: 使用重载运算符本质上一次函数调用 所以这些关于运算对象求值顺序规则无法应用到重载运算符上 一般不重载逗号运算符和取地址运算****符 因为这两种运算符已经有了内置含义...明智使用重载运算符 运算符重载 每个运算符在用于内置类型都有比较明确含义。 当在内置运算符和我们自己操作之间存在逻辑映射关系运算符重载效果最好。...过分滥用运算符重载也会使我们类变得难以理解。 例如 把operator+定义并让它执行 减法操作 就非常友好了。 只有当操作含义对于用户来说清晰明了才使用运算符。...下面的准则有助于我们在将运算符定义为成员函数还是普通成员函数做出抉择: ●赋值(=)、下标([])、调用(l)和成员访问箭头(->)运算符必须成员

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

    在此,我们可以对C++规则做出以下判断:   类中没有定义赋值运算符重载成员函数(注意,在未定义形参数据类型为该类类型赋值运算符重载函数,编译器会自动生成加入),程序执行到某一赋值语 句,...像最初赋值语句a = 7,执行时,实际做操作a(7)。而类中有定义赋值运算符重载成员函数,执行赋值语句,程序就只会去调用相应赋值运算符重载函数。 ...明白上面的规则后,现在就可以回过来,讨论为什么赋值运算符不可重载为类友元函数了。 我们知道友元函数不是类成员函数,它只是类“朋友“,具有访问把它声明为“朋友”数据成员权限而已。...程序不允许有矛盾不确定选择,所以赋值运算符重载为类友元函数,编译器就会提示错误。 对于剩下3个运算符 ->, [], () 为什么不能重载为友元函数,也是跟上面一样道理。...即编译器发现类中没有定义这3个运算符重载成员函数,就会自己加入默认运算符重载成员函数。

    99320

    C++ 类、继承、重载《Rice C++ 学习开发》

    使用不同类型继承,遵循以下几个规则: 公有继承(public):一个类派生自公有基类,基类公有成员也是派生类公有成员,基类保护成员也是派生类保护成员,基类私有成员不能直接被派生类访问...保护继承(protected): 一个类派生自保护基类,基类公有和保护成员将成为派生类保护成员。...您调用一个重载函数或重载运算符,编译器通过把您所使用参数类型与定义中参数类型进行比较,决定选用最合适定义。选择最合适重载函数或重载运算符过程,称为重载决策。...:重载运算符带有特殊名称函数,函数名由关键字 operator 和其后要重载运算符符号构成。...),->(成员访问),,(逗号),[](下标) 不可重载运算符成员访问运算符.成员指针范文运算符.

    63510

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

    运算符重载C++多态重要实现手段之一。通过运算符重载运算符功能进行特殊定制,使其支持特定类型对象运算,执行特定功能,增强C++扩展功能。...运算符重载我们需要坚持四项基本原则: (1)不可臆造运算符; (2)运算符原有操作数个数、优先级和结合性不能改变; (3)操作数中至少一个自定义类型; (4)保持重载运算符自然含义...一般来说,C++运算符重载可采用成员函数和友元函数,二者都可以访问私有成员,那么该采用哪一种呢?首先看一下二者区别。...(1)重载成员函数,会隐含一个this指针;重载为友元函数,不存在隐含this指针,需要在参数列表中显示地添加操作数。...(2)重载成员函数,只允许右参数隐式转换;重载为友元函数,能够接受左参数和右参数隐式转换。

    2.3K20

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

    操作符重载,又名运算符重载 C++ 多态重要实现手段之一。通过运算符重载运算符功能进行特殊定制,使其支持特定类型对象运算,执行特定功能,增强 C++ 扩展功能。...对运算符重载,我们需要坚持四项基本原则: (1)不可臆造运算符; (2)运算符原有操作数个数、优先级和结合性不能改变; (3)操作数中至少一个自定义类型; (4)保持重载运算符自然含义。...一般来说,C++ 运算符重载可采用成员函数和友元函数,二者都可以访问私有成员,那么该采用哪一种呢?首先看一下二者区别。...重载成员函数,会隐含一个 this 指针;重载为友元函数,不存在隐含 this 指针,需要在参数列表中显示添加操作数。...重载成员函数,只允许右参数隐式转换;重载为友元函数,能够接受左参数和右参数隐式转换。

    99630

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

    您调用一个重载函数或重载运算符,编译器通过把您所使用参数类型与定义中参数类型进行比较,决定选用最合适定义。选择最合适重载函数或重载运算符过程,称为重载决策。...这样,您就能使用自定义类型运算符重载运算符带有特殊名称函数,函数名由关键字 operator 和其后要重载运算符符号构成。与其他函数一样,重载运算符有一个返回类型和一个参数列表。.../不可重载运算符下面重载运算符列表:双目算术运算符+ (加),-(减),*(乘),/(除),% (取模)关系运算符==(等于),!...),->(成员访问),,(逗号),[](下标)下面不可重载运算符列表:....:成员访问运算符.*, ->*:成员指针访问运算符:::域运算符sizeof:长度运算符?::条件运算符#: 预处理符号运算符重载实例下面提供了各种运算符重载实例,帮助您更好地理解重载概念。

    2K30

    【C++】‘类与对象‘-三部曲——(4)(23)

    内部类一个独立类,它不属于外部类,更不能通过外部类对象去访问内部类成员。外部类对内部类没有任何优越访问权限。...四.类六个默认成员函数 特点: 没有显式定义(我们不主动写),编译器会自动生成 1.构造函数(第一个) 默认构造函数(3种):(1) 类自己生成函数(2)无参 (3)全缺省函数 特征...需要自己写情况: 一般情况下,有内置类型成员,要自己写(否则会初始化成随机值) 不需要自己写情况: 内置类型成员都有缺省值,且初始化符合要求,可以考虑让编译器自己生成 全部都是自定义类型成员...; 运作上看,对象生命周期结束,编译器会自动调用它 形态上看,其在类名前加上~,且无返回值 注意点,析构函数不允许重载。...:例如operator@ 重载操作符必须有一个类类型参数 用于内置类型运算符,其含义不能改变:例如+ 作为类成员函数重载,其形参看起来比操作数少一个(因为成员函数第一个参数为隐藏this) .*

    14710

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

    运算符重载通用语法 在重载,你不能更改 C++ 中内置类型运算符含义,只能对自定义类型[1]运算符进行重载。也就是,运算符两边操作数至少有一个自定义类型。...运算符重载一种特殊函数。和其它函数一样,运算符重载既可作为成员函数,也可作为非成员函数。...其它运算符可以定义为成员函数,也可以定义为非成员函数。但是有一些你不得不定义成非成员函数,因为它们左操作数不可修改。...如果二元运算符,且会修改其左/右操作数(一般都是左),则实现为成员函数,因为一般你都需要访问其私有成员。 当然,也有一些例外。...operator< (lhs,rhs); } 译注:在比较可能还是需要访问其私有成员

    73610

    C++面向对象学习之运算符重载(1)

    举个例子:你嘴既可以吃饭,也可以说话,这其中就蕴含了重载概念,它 作为进食器官,它发挥其应有功能,而你想让它说话,你就好比一台计算机,检测到你嘴有被重载过,让它支持说话功能,重载其实就这么简单...: 重载运算符作为成员函数 operator () { } 可以看到,重载函数 operator+访问了两个对象中成员,一个对象中成员...这里给出大致解答: 如果将运算符重载函数作为成员函数,它可以 通过 this指针自由地访问本类数据成员,因此可以少写一个函数参数。 但 必须要求运算表达式第一个参数(即运算符左侧操作数)一个类对象...元函数,也可以将一个运算符重载函数(运算符左侧为对象名) 作为成员函 数,另一个(运算符左侧不是对象名)作为友元函数。 但不可能将两个都作为 成员函数,原因显然。 C++中可重载运算符重载为数众多...-> :通过指针访问成员运算符 6、可重载运算符列表 + - * / % ^ & | ~= !

    84130

    【C++类和对象】const成员函数及流插入提取

    目录 前言 1.const成员函数 2.取地址以及const取地址操作符重载 3.流插入流提取运算符重载 4.结语 1.const成员函数 const成员函数指在函数声明和定义使用const关键字修饰成员函数...注意: const成员函数内不可以调用其它非const成员函数 在const成员函数内不允许调用非const成员函数。因为const成员函数被声明为const,它承诺了不会修改类成员变量。...在C++中流插入提取操作符重载不可重载成员函数,因为它们参数顺序不可以改变,例如: 这是因为流插入第一个运算符cout,而如果将其重载成员函数第一个参数就是类和对象中隐含this指针...,所以参数顺序不匹配,我们只能将其重载成全局函数;与此同时流插入运算符和流提取运算符通常都是以友元函数形式定义在类声明内部,这允许它们访问私有成员。...,这允许它们访问私有成员

    11010

    C++之面向对象三个基本特征

    : 9条件运算符 3)重载不可以改变操作数个数; 4)重载不可改变运算符优先级别 5)重载不能运算符结合性; 6)重载运算符函数不能用默认参数; 7)重载运算符必须和用户定义自定义类型对象一起使用...运算符重载函数作为 类成员函数 与 友元函数(形参必须有要求) 一般将单目运算符和复合运算符重载成员函数 一般将双目运算符重载为友元函数;   重载双目运算符 C++构造函数重载 在一个类中可以定义多个构造函数...C++规定,一个成员函数被声明为虚函数后,其派生类中同名函数都自动成为虚函数。...但与重载不同:同一类族虚函数首部相同,而函数重载函数首部不同(参数个数或类型不同)。 关联—binding 确定调用具体对象过程称为 关联。...3)应考虑对成员函数调用是通过对象名还是通过基类指针或引用去访问,如果通过基类指针或引用去访问,则应当声明为虚函数; 4)有时,在定义虚函数,并不定义其函数,即函数体

    1.1K60

    类和对象:运算符重载

    尝试将赋值运算符重载函数作为静态函数进行定义: 在C++中,赋值运算符 = 被设计为类成员函数,这是因为它需要访问内部状态,并且需要能够处理自赋值情况(即对象赋值给自己)。...当你尝试将赋值运算符重载为全局函数,会出现问题,原因如下: 成员访问权限:作为全局函数,赋值运算符将无法访问非公共(private或protected)成员变量。...成员函数可以直接访问这些成员,因为它们一部分。 this指针:成员函数有一个隐式指针 this,它指向调用该成员函数对象。...这是为了保持语言一致性和防止潜在错误使用。 因此,尝试将赋值运算符重载为全局函数,编译器会报错,因为它违反了C++规则和赋值运算符预期行为。...正确做法将其作为类成员函数来重载,以确保正确访问权限、自赋值保护以及符合C++语法和语义要求。

    10210

    Java基础第一阶段知识点,招实习面试官都在问这些

    什么隐式类型转换?什么显示类型转换? a) 将占位数少类型赋值给占位数多类型,Java自动使用隐式类型转换。 b) 把在级别高变量值赋给级别底变量,必须使用显示类型转换运算。...什么方法重载? a) 方法重载指一个类中可以有多个方法具有相同名字,但这些方法参数必须不 同,即或者参数个数不同,或者参数类型不同。 18. 什么构造方法?...a) 类有两种访问权限:public,友好。 b) 方法和变量访问权限:public,protected,友好,private。 28. 简述java访问权限。...a) public:公有的,任何类都可以访问。 b) protected:受保护,同一个包类可以访问。不同包子类可以访问。 c) 友好:同一个包类可以访问。...a) 假设,A 类B 类父类,当我们用子类创建一个对象,并把这个对象引用放 到父类对象中,我们称这个父类对象是子类对象上转型对象。 34. 上转型对象可以操作什么?不可以操作什么?

    58090

    C++类和对象 复习

    /cpp-classes-objects.html ---- 目录 类和结构体区别 类创建 构造/析构函数 友元函数 内联函数 类静态成员访问修饰符 继承 特点 基类/派生类 多继承 运算符/...---- 类访问修饰符 Public成员在程序中类外部访问。可以不使用任何成员函数来设置和获取公有变量值 Private成员变量或函数在类外部不可访问,甚至不可查看。...Protected成员变量或函数与私有成员十分相似,但有一点不同,protected(受保护)成员在派生类(即子类)中访问。.../函数重载 调用一个重载函数或重载运算符,编译器通过把所使用参数类型与定义中参数类型进行比较,决定选用最合适定义。...选择最合适重载函数或重载运算符过程,称为重载决策。

    54430

    【笔记】《C++Primer》—— 第19章:特殊工具与技术

    19.1 控制内存分配 我平时有时候会说“重载new和delete”,但实际上重载这两个运算符重载其他运算符大不相同,准确来说实际上我们并不能重载new和delete,这需要了解new和delete...要转到指针,目标必须指针;要转到左值引用则必须左值,要转到右值引用则必须不是左值 对目标指针类型转换失败会返回0,目标引用失败抛出bad_cast异常,这个异常在typeinfo头文件里...typeid不会自动进行指针标准类型转换,也就是e数组返回数组类型而不是指针类型 目标e没有虚函数,typeid返回目标的静态类型,e定义了至少一个虚函数左值,结果会到运行时才求得...,否则编译器会认为此函数声明无效,后面的取地址符也不可少,这是因为成员函数到函数指针间没有自动转换规则 我们调用成员函数方法和使用成员类差不多,区别是标志着函数名括号仍然不可少,这是因为调用运算符优先级太高了...,类中用一个enum标记此时类型来控制,这个标记被称为判别式 union也可以匿名定义,此时在其所在作用域中union成员都可以被直接访问,匿名union不可以有保护和私有成员,也不可以有函数 union

    84240

    Java基础第一阶段知识点,招实习面试官都在问这些

    什么隐式类型转换?什么显示类型转换? a) 将占位数少类型赋值给占位数多类型,Java自动使用隐式类型转换。 b) 把在级别高变量值赋给级别底变量,必须使用显示类型转换运算。...什么方法重载? a) 方法重载指一个类中可以有多个方法具有相同名字,但这些方法参数必须不 同,即或者参数个数不同,或者参数类型不同。 18. 什么构造方法?...a) 类有两种访问权限:public,友好。 b) 方法和变量访问权限:public,protected,友好,private。 28. 简述java访问权限。...a) public:公有的,任何类都可以访问。 b) protected:受保护,同一个包类可以访问。不同包子类可以访问。 c) 友好:同一个包类可以访问。...a) 假设,A 类B 类父类,当我们用子类创建一个对象,并把这个对象引用放 到父类对象中,我们称这个父类对象是子类对象上转型对象。 34. 上转型对象可以操作什么?不可以操作什么?

    50610

    运算符重载

    但是,这样运算符函数访问私有和保护成员,必须使用类公有接口中提供设置数据和读取数据函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)   ...成员函数运算符  运算符重载为类成员函数一般格式为: operator () { }   运算符重载为类成员函数...因此: (1) 双目运算符重载为类成员函数,函数只显式说明一个参数,该形参运算符右操作数。 (2) 前置单目运算符重载为类成员函数,不需要显式说明参数,即函数没有形参。...(6) 运算符函数一个成员函数,最左边操作数(或者只有最左边操作数)必须运算符一 个类对象(或者对该类对象引用)。...如果左边操作数必须一个不同类对象,或者一个内部 类型对象,该运算符函数必须作为一个友元函数来实现。(7) 需要重载运算符具有可交换性,选择重载为友元函数。

    1.1K70

    运算符重载

    运算符重载 友元 友元函数 友元函数定义在类外部,但有权访问所有私有(private)成员和保护(protected)成员。...若类B类A友元。则只有类B成员函数可以访问类A中隐藏信息 友元单向,不具有交换性。 若类B类A友元,类A不一定是类B友元,要看在类中是否有相应声明。 友元关系不具有传递性。...其他运算符 ()(函数调用),->(成员访问),,(逗号),[](下标) 不可重载运算符 ....:成员访问运算符 .*, ->*:成员指针访问运算符 :::域运算符 sizeof:长度运算符 ?...::条件运算符 #: 预处理符号 运算符重载注意事项 运算重载不可以改变语法结构 运算重载不可以改变操作数个数 运算重载不可以改变优先级 运算重载不可以改变结合性 不能创建新运算符 +,-

    93260
    领券