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

为什么我需要让这个非友元==操作符重载一个成员函数,以避免“未定义的引用”错误?

非友元==操作符重载一个成员函数的目的是为了避免"未定义的引用"错误。在C++中,成员函数是隐式访问其所属类的成员的,因此在成员函数内部可以直接访问该类的私有成员变量。而如果非友元==操作符不被重载为成员函数,而是作为全局函数,则无法直接访问类的私有成员变量,从而导致"未定义的引用"错误。

通过将非友元==操作符重载为成员函数,可以确保在比较两个类对象时,可以直接访问类的私有成员变量,避免"未定义的引用"错误的发生。重载后的==操作符将能够比较两个类对象的私有成员变量,并根据需要返回比较结果。

例如,假设有一个名为"Person"的类,其中包含私有成员变量"name"和"age"。如果我们想要比较两个"Person"对象的"name"和"age"是否相等,可以将==操作符重载为成员函数。这样,在比较过程中,就可以直接访问类的私有成员变量,避免"未定义的引用"错误的发生。

以下是一个示例代码:

代码语言:txt
复制
class Person {
private:
    std::string name;
    int age;
public:
    bool operator==(const Person& other) const {
        return (name == other.name) && (age == other.age);
    }
};

int main() {
    Person p1("John", 25);
    Person p2("John", 25);
    if (p1 == p2) {
        // 两个Person对象相等
    } else {
        // 两个Person对象不相等
    }
    return 0;
}

在上述示例中,通过重载==操作符为成员函数,我们可以直接比较两个Person对象的私有成员变量"name"和"age"是否相等,而不需要通过其他方式间接访问私有成员变量,从而避免了"未定义的引用"错误的发生。

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

  • 腾讯云主页:https://cloud.tencent.com/
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb
  • 腾讯云云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网开发平台(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发平台(MTP):https://cloud.tencent.com/product/mtp
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++修行之道】类和对象(五)日期类实现、const成员、取地址及const和取地址操作符重载

效率:返回引用避免了不必要创建和返回对象拷贝。在C++中,对象复制可能是一个昂贵操作。 链式操作:通过返回引用,可以支持链式操作。...而temp是临时对象,因此只能以值方式返回,不能返回引用 1.7 输入输出流重载 // 函数声明,声明后可访问私有成员变量 friend ostream& operator<<(ostream&...const对象不能调用const成员函数。 当你将一个对象声明为const时,实际上是在承诺不会修改这个对象状态。因此,只能对这个对象调用const成员函数,因为这些函数承诺不会修改对象状态。...但这种做法是不推荐,因为它破坏了const正确性和对象常量性质,可能导致未定义行为或程序错误。通常来说,应该尽量避免这种做法。...总结来说,const成员函数内不能直接调用const成员函数保持const成员函数承诺不修改对象状态。 4. const成员函数内可以调用其它const成员函数吗?

9710

读完某C++神作,只记下了100句话

.*/ */ 是错误 表示整数、字符和布尔值算术类型合称为整形。区分类型是因为只有知道某地址值类型,才能知道需要多少位表示这个变量和如何解释这些位。...引用初始化后始终绑定到初始化对象,不能改变【引用本身不占存储单元】。const对象必须由const引用指向【避免一个能修改,一个不能修改,既对象本身和代表其引用必须同时为const】。...:将非公有成员访问权授予指定类或函数。friend在类定义内部。引入类名和函数(定义或声明)可以像预先声明一样使用。...使用算法sort等时会假定一些操作符(<)存在,此时要为类型定义重载操作符重载操作符如果是成员函数,左操作数必须是该类对象【一定是this】。 用函数或类操作某个类数据可设置其为。...派生类继承基类访问控制标号【何种方式继承】无论是什么,不影响派生类使用基类成员,但影响使用派生类用户访问基类成员。类使用接口继承还是实现继承对派生类用户具有重要含义。 关系不继承。

1.4K20
  • C++从入门到精通——类6个默认成员函数之赋值运算符重载

    三、前置++和后置++重载 示例 概念 四、深挖operator 函数 模拟实现 函数 前言 类6个默认成员函数:如果一个类中什么成员都没有,简称为空类。...我们将流输出操作符 << 声明为函数,并在函数中实现输出对象内容。在主函数中,我们创建了一个名为objMyClass对象,并使用流输出操作符将其内容输出到标准输出流中。...,第一个对象永远是this指针,写成cout<<d1是错误写法,即函数重载中,参数顺序和操作数顺序是一致。...对象成员函数作为函数:在另一个成员函数中通过关键字将该类成员函数声明为函数。在函数定义中,可以直接访问该类私有成员和保护成员。...函数使用应该谨慎,因为它破坏了封装性原则,导致代码可读性和可维护性降低。在设计类时候,应该尽量避免使用友函数,而是通过成员函数来操作类私有成员和保护成员

    12510

    与C++类和对象宿命(下)

    0; } 函数使用场景: 运算符重载:有时候需要通过非成员函数实现运算符重载,而这些函数需要访问类私有数据,此时函数非常有用。...例如,重载 > 操作符时,通常将其声明为类函数。 类之间紧密合作:如果两个类需要相互访问私有成员,而又不希望破坏封装性,可以将一个函数声明为另一个。...这个是不对关系是不能传递 并且A是B 但是B不是A,因为关系是单向,不具有交换性 在C++中,(friend) 是一个特殊功能,允许一个类将其他类或函数声明为它...使用场景: 函数一个成员函数可以被声明为类,这样它可以直接访问该类私有和保护成员。...endl; } 类:一个类可以将另一个类声明为类,允许该成员函数访问它私有成员

    19810

    深度总结了类相关知识)(中)

    ,并且通常定义为函数以便它能访问类私有成员。.... >> 运算符重载 和<<一样需要定义函数以便它能访问类私有成员,其他注意问题与<<同理解决,建议模仿上述代码自行理解。...Date& d: 一个传递进来 Date 对象引用。因为这是一个 const 引用,意味着可以在函数内对 Date 对象进行修改(即从输入流中读取到数据将赋值给这个 Date 对象)。...int year; int month; int day; // 声明函数,方便外部重载流插入与流提取函数访问私有成员变量 friend ostream& operator<<(ostream...这类函数声明在函数名后面加上const关键字,用来保证这个函数不会修改任何const成员变量。 特点: 不能修改成员变量: 在const成员函数中,不能修改任何const成员变量。

    9410

    【C++初阶】类和对象终极篇

    const修饰,这样的话,有两个优点: const和const对象都能调用这个函数 引用值受到const保护,在函数内部不能被修改....其实对于自定义类型运算符重载函数代码实现问题不大吗,难点在于这个函数是写成ostream类成员函数,全局函数,Date类成员函数,Date类函数一步一步优化. a.作为ostream成员函数...初始化列表:一个冒号开始,接着是一个逗号分隔数据成员列表,每个"成员变量"后面跟 一个放在括号中初始值或表达式。...先来复习一下函数: 函数可访问类私有和保护成员,但不是类成员函数 函数不能用const修饰 函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数...函数调用与普通函数调用原理相同 类 :是你,就可以偷你所有成员函数都可以是另一个函数,都可以访问另一个类中非公有成员

    22650

    运算符重载使用它类对象作为参数

    在使用时候,我们需要让类 Sender 重载 << 操作符实现将 Mail 类数据发送出去,大致用法就是 Sender << Mail 这样方式。这就涉及到了诸多问题。...此时就发挥了作用,我们需要将 Sender 类中运算符重载函数在 Mail 类中声明为函数,这样 Sender 类才能正常访问 Mail 类私有成员。...这个问题类似我们之前介绍过“类A成员函数做类B函数”。...(string addr) :_addr(addr){} // 操作符重载函数,返回 Sender 引用是为了连续 << 操作 Sender& operator<<(Mail& mail); private...}; class Mail { public: Mail(string title, string content) :_title(title), _content(content){} // 声明函数时候要加域

    13730

    【C++入门篇】保姆级教程篇【下】

    声明这个operator<<函数这个,那么作为你朋友就可以访问这个私有成员变量(具体可以往后翻到那一节),这样就不需要担心私有成员不能访问问题了。...我们来看一看C++中初始化方式吧。 1)初始化列表 初始化列表:一个冒号开始,接着是一个逗号分隔数据成员列表,每个"成员变量"后面跟一个放在括号中初始值或表达式。...,但是我们又不希望这个函数出现在类内部,那样我们就只能用Get方法来返回类私有成员变量,但是我们在C++中并不经常使用Get和Set方法,而是使用另一个东西来访问类私有成员变量/函数——...我们前面在流插入与流提取就用到了函数,声明流操作符函数为类函数,则这个函数就可以访问这个私有成员变量: friend void operator<<(ostream &out, Date...const修饰 4、一个函数可以是多个类函数 5、函数调用与普通函数调用和原理相同 2)所有成员函数都可以是另一个函数

    13310

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

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

    25910

    【笔记】《C++Primer》—— 第7章:类

    成员函数若以引用形式返回*this,则此时返回是常量引用 尽量避免在多处使用相同代码,所以尽量把类似的功能写为函数并迭代组合使用 类可以声明而暂时不定义,此时成为前向声明,得到类是不完全类型,可以作为参数...,返回类型,指针等 注意函数没有传递性,即类似自己有自己并不代表自己可以得到其他权限 声明某个类成员函数时,需要指定出这个函数是属于哪个类 对于重载函数声明时,每一种重载都要分别声明一次...前面说到即使在类内声明了也要在外部提供相应声明,这是因为我们需要函数在外部被使用/引用时,也处于正确作用域之中,不过很多编译器并不强制要求这一点而是进行了优化 7.4 类作用域 定义函数时...C11增加了“委托构造函数”,即我们可以简化之前重载多个类似的构造函数代码,我们可以在构造函数初始值列中调用委托构造函数了 ?...,不能在外部重复这个关键字 如同其余静态变量,静态成员只会被定义初始化一次 由于静态成员只在程序生命中定义一次,所以我们一方面最好将其定义与其他内联函数放在一起保证唯一次定义 静态成员类内应对常量型提供

    61020

    C++primer学习笔记(五)

    简单说,类就是定义了一个类型和一个作用域。成员访问级别默认私有。在声明和定义处指定inline都是合法。类前向声明一般用来编写相互依赖类。类定义分号结束,之后可以跟对象列表。...:将非公有成员访问权授予指定类或函数。friend在类定义内部。引入类名和函数(定义或声明)可以像预先声明一样使用。...static成员函数没有this形参,可直接访问类static成员,不能使用static成员。 静态数据成员属于一个类,而不属于类各个对象。静态成员函数在所有对象建立之前或删除之后仍然使用。...构造函数如果是explicit必须严格按照定义使用构造函数,否则可以存在隐式转换。 引用形参将复制实参值,引用return将复制return东西。...使用算法sort等时会假定一些操作符(<)存在,此时要为类型定义重载操作符重载操作符如果是成员函数,左操作数必须是该类对象【一定是this】。 用函数或类操作某个类数据可设置其为

    36810

    九、运算符重载

    作为函数重载: 适用于需要访问类私有或受保护成员,或者当运算符两个操作数都是用户定义类型时。函数不是类成员函数,但可以被授予访问类私有成员权限。...// 注意:这里通常返回一个引用,以便支持链式操作 return /* 返回某个元素或子对象引用 */; } 作为函数重载 当运算符重载函数时,它可以访问类私有和保护成员...如何重载算术运算符 要重载算术运算符,你需要在类内部或外部(通过函数)定义一个特殊成员函数或非成员函数这个函数以关键字operator后跟你想要重载运算符名称命名。...函数:有时,为了允许访问类私有或受保护成员,你可能需要将重载运算符函数声明为类。...重载插入运算符(operator<<) 插入运算符<<通常用于将对象内容输出到流中,比如打印到控制台。这个运算符通常作为非成员函数重载,并声明为类,以便它能够访问类私有和保护成员

    11510

    《Effective C++》学习笔记

    条款23:宁成员替换成员函数 宁可拿非成员函数来替换成员函数。...但是,非成员函数不代表就一定成为函数,能够通过public函数调用完成功能,就不该设为函数避免权力过大造成麻烦。...如果效率不够,那么给你类提供一个成员函数swap,用来对那些复制效率低成员变量(通常是指针)做交换。 然后,提供一个成员函数swap来调用这个成员函数,供别人调用置换。...解决方案是将该模板函数定义为模板类内模板函数,从而支持了参数隐式转换。...如果函数功能比较简单,可以直接inline,如果比较复杂,可以调用一个类外定义好模板函数(此时,函数已经给参数做了类型转换,因此可以调用模板函数了)。

    1.1K20

    运算符重载

    运算符重载 函数 函数是定义在类外部,但有权访问类所有私有(private)成员和保护(protected)成员。...尽管函数原型有在类定义中出现过,但是函数并不是成员函数。...关键字friend friend 返回值类型 函数名(参数列表); friend void global_printf(const Point&that); //函数 所有成员函数都是另一个函数...Complex operator=(const Complex&other); //=运算符重载 成员函数实现 注意事项 避免自赋值 释放旧资源 分配新资源 拷贝新内容 返回自引用 //为了简便...流操作符>>,<<重载 cout是输出类对象,而cin是输入类对象,C++头文件iostream取自istream和ostream之意 流操作符>>,<<一般使用非成员函数实现,也就是函数实现

    94060

    【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

    分为:函数类 通俗而言:函数声明表达了函数能够访问这个权限,相当于客人(函数拥有主人家钥匙(声明),可以随便进出主人家里,偷吃主人家里饼干(访问私有域成员...关键字 说明: 函数可访问类私有和保护成员,但不是类成员函数 函数不能用const修饰 函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数...所有成员函数都可以是另一个函数,都可以访问另一个类中非公有成员。...@ 重载操作符必须有一个类类型参数 用于内置类型运算符,其含义不能改变:例如+ 作为类成员函数重载时,其形参看起来比操作数少一个(因为成员函数一个参数为隐藏this) .* / :: /sizeof...一个模板函数可以和一个同名函数模板同时存在,而且该函数模板还可以被实例化为这个模板函数 对于模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用模板函数而不会从该模 板产生出一个实例

    18210

    CC++编码规范

    对于内置类型参数应传递引用(首选)或指针。 避免使用参数不确定函数。 若不得不适用参数不确定函数,用提供方法。...函数声明(而不是实现)时定义参数缺省值 恰当选择成员函数、全局函数函数 防范、杜绝潜在二义性 显式禁止编译器自动生成不需要函数 < 14...任何声明若被多个源文件引用则应在一个头文件中 头文件中尽量避免包含其他头文件 2.7性能 使用性能追踪分析工具 不要用移位代替乘除运算 如无必要,不要用int... 区分作为成员函数和作为操作符 尽量使用前缀操作符 确保相关一组操作符行为统一 绝不要自定义operator&&()、operator||... 尽量避免重载在模板类型上 2.15 少用友 减少拥有特权个数 2.16模板 使用模板如果有限制条件一定要在注释和文档中描述清楚

    2K20

    C++之类和对象

    引入 函数 类 内部类 匿名对象 拷贝对象时编译器一些优化 再次理解类和对象 面向对象和面向过程初步认识 在学习C语言时候,遇到一个问题时候我们更关注于是解决这个问题需要哪些步骤;...,那就因小失大了,所以最好办法就是讲运算符重载写在类里面,否则是无法访问到成员变量: ---- 那么为什么在写运算符重载时候只传了一个参数,而且是需要加天数而不对象呢?...为了解决这个问题呢C++就提出了一个东西,又分为函数类; 函数 **函数可以直接访问类私有成员,它是定义在类外部普通函数,不属于任何类,但需要在类内部声明,声明时需要加...总结 函数可访问类私有和保护成员,但不是类成员函数函数不能用 const 修饰; 函数可以在类定义任何地方声明,不受类访问限定符限制; 一个函数可以是多个类函数函数调用与普通函数调用原理相同...; 所有成员函数都可以是另一个函数,都可以访问另一个类中非公有成员 (不受访问限定符限制)。

    1.2K00

    类和对象(3)

    因为初始化只能初始化一次,而构造函数体内可以多次赋值。 初始化列表 一个冒号开始,接着是一个逗号分隔数据成员列表,每个"成员变量"后面跟一个放在括号中初始值或表达式。...在_a2初始化时,_a1是未定义(即处于未初始化状态),但C++标准并不要求在这种情况下编译器产生错误或警告。...分为:函数函数 现在尝试去重载operator,然后发现没办法将operator重载成员函数。...,但不是类成员函数 函数不能用const修饰 函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数 函数调用与普通函数调用原理相同 所有成员函数都可以是另一个函数...关系不能传递 如果C是B, B是A,则不能说明C是A关系不能继承。 内部类 概念:如果一个类定义在另一个内部,这个类就叫做内部类。

    5810

    【C++修行之道】类和对象(六)再谈构造函数(初始化列表)| explicit关键字 | static成员 | |匿名对象|拷贝时一些编译器优化

    ,接着是一个逗号分隔数据成员列表,每个"成员变量"后面跟一个放在括号中初始值或表达式。...但是会增加耦合度,破坏了封装,所以不宜多用。 分为:函数类 3.1 函数 问题:现在尝试去重载operator>同理。...,但不是类成员函数 函数不能用const修饰 函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数 函数调用与普通函数调用原理相同 3.2 所有成员函数都可以是另一个函数...简洁性:返回匿名对象使代码更简洁,不需要手动管理临时对象生命周期。 避免副作用:匿名对象生命周期受限于其所在表达式范围,减少了意外修改或使用未定义对象风险。

    9410

    深度总结了类相关知识)(下)

    本质: 打破了 C++ 封装严格限制,使得指定外部函数或类能够访问类私有成员和保护成员并不是类成员,它是一种特殊外部“访问权限声明”。...类型: 函数:普通函数可以通过在类内声明为,从而可以访问该类私有和保护成员类:一个类可以将另一个类声明为,这样所有成员函数都能访问该类私有和保护成员。...成员函数:某类特定成员函数可以被声明为,只对该特定函数开放访问权限。...应用场景: 操作符重载:特别是像 > 这样输入输出运算符重载,通常需要通过函数来访问类私有数据。...示例 - 操作符重载函数: class Complex { private: double real, imag; public: Complex(double r, double

    6310
    领券