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

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

一、运算符重载 运算符重载允许把标准运算符(如+、-、*、/、等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性 运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式...运算符重载,本质上是函数重载 不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代码更容易写、尤其是更易读时才有必要重载 二、成员函数重载 成员函数原型的格式: 函数类型 operator...运算符(参数表); 成员函数定义的格式: 函数类型 类名::operator 运算符(参数表) { 函数体; } 三、非成员函数重载 友元函数原型的格式: friend...类成员指针引用的运算符 .* sizeof运算符 sizeof 注:.*是C++的类成员函数指针调用运算符,是用来调用一个类函数指针的。...c1 + c2; 那么可以实现operator+ 运算符重载,可以是成员函数形式,也可以是友元形式,如果两者共存的话成员函数优先。

90300
您找到你想要的搜索结果了吗?
是的
没有找到

C++之类成员函数重载学习总结

一、类中的函数重载: 1、函数重载的温习: 函数重载的本质为相互独立的不同函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到函数重载函数的入口地址 函数重载必然发生在同一个作用域中...2、类中的成员函数可以进行重载: 构造函数的重载 普通成员函数的重载 静态成员函数的重载 这里有一个问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载?...从上面回顾重载函数的知识中,我们要注意到一点函数重载必须发生在同一作用域里面(其他两点问题不大),所以的构造函数和普通成员函数是可以构造重载的,而与全局函数是不可以构成重载的。.../a.out linux i 这个函数就保护程序的安全性;但是我在c++里面既然学习了函数重载,那么久可以在原有的函数基础上进行扩展: 代码版本三: #include #include.../a.out linux i 二、总结: 类的成员函数之间可以进行重载 重载必须发生在同一个作用域中 全局函数和成员函数不能构成重载关系 重载的意义在于扩展已经存在的功能 好了,今天的分享就到这里,

47910

C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

成员变量值是 o1 和 o2 中number成员变量之和 Operator o4 = o1 + o2; //打印 o3 中的 number 变量值 cout << "内部定义的运算符重载简化写法结果...o1 和 o2 中number成员变量之和 Operator o4 = o1 + o2; //打印 o3 中的 number 变量值 cout << "内部定义的运算符重载简化写法结果 : " <...Operator 的 number 成员变量值之积 ; //类外部定义云算符重载 // 使用该重载云算符时 , 将两个对象相乘 , 获得的第三个对象 , // 该对象的 number 成员变量值 ,...类中自定义的运算符重载 //其作用是返回一个对象 , 其number成员变量值是 o1 和 o2 中number成员变量之和 Operator o4 = o1 + o2; //打印 o3 中的..., 其number成员变量值是 o1 和 o2 中number成员变量之和 Operator o4 = o1 + o2; //打印 o3 中的 number 变量值 cout << "内部定义的运算符重载简化写法结果

51820

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

二、运算符重载语法 - 类内部定义云算符重载 ( 成员函数 ) 1、运算符重载函数语法说明 C++ 中允许重新定义运算符的行为 , 如常用的加减成熟运算符 , 都可以进行重载操作 ; 可以自定义运算符的操作...//其作用是返回一个对象 , 其number成员变量值是 o1 和 o2 中number成员变量之和 Operator o4 = o1 + o2; //打印 o3 中的 number 变量值...//其作用是返回一个对象 , 其number成员变量值是 o1 和 o2 中number成员变量之和 Operator o4 = o1 + o2; //打印 o3 中的 number 变量值...Operator 的 number 成员变量相乘 , 然后返回一个新的 Operator 对象 , 其 number 成员变量值是两个 Operator 的 number 成员变量值之积 ; //类外部定义云算符重载..., 其number成员变量值是 o1 和 o2 中number成员变量之积 Operator o6 = o1 * o2; //打印 o6 中的 number 变量值 cout << "外部定义的运算符重载简化写法结果

20110

C++】类与对象(运算符重载、const成员、取地址重载

今日更新了类与对象运算符重载、const成员、取地址重载的内容 欢迎大家关注点赞收藏⭐️留言 赋值运算符重载 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数...函数名字为:关键字operator后面接需要重载的运算符符号。...由上图可知,运算符重载成全局的就需要成员变量是公有的, 可这样封装性就没了保证。 下面是解决方法: 我们把operator放到类里面,这样就不需要把内置类型的变成公开的了。...形成能正确重载 // C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递 // 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将...如上图,当我们想打印d1时,会发生错误。因为传d1地址时, 类型是const Date*,而print函数的this指针类型是Date*。发生了权限的放大。

8310

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

操作符重载,又名运算符重载,是 C++ 多态的重要实现手段之一。通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强 C++ 的扩展功能。...一般来说,C++ 运算符重载可采用成员函数和友元函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。...当重载成员函数时,会隐含一个 this 指针;当重载为友元函数时,不存在隐含的 this 指针,需要在参数列表中显示添加操作数。...当重载成员函数时,只允许右参数的隐式转换;当重载为友元函数时,能够接受左参数和右参数的隐式转换。...,最好将其重载为友元函数;而对于单目运算符,则最好重载成员函数。

88030

【非原创】C++成员函数的重载、覆盖和隐藏

题目: 类成员函数的重载、覆盖和隐藏区别描述正确的有?...A、覆盖是指在同一个类中名字相同,参数不同 B、重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字 C、派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数 D...、函数名字相同,参数相同,基类无virtual关键字的派生类的函数会"隐藏"父类函数 答案: CD 解析: a.成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同;...此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。 (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。

67120

从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载operator new 和 operator delete

一、类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名(); #ifndef _INTEGER_H_ #define _INTEGER_H...二、->运算符重载 类* operator->(); 类& operator*(); #include  using namespace std; class DBHelper {...->())->Open(); 会调用operator-> 返回DBHelper类的指针,调用DBHelper的成员函数Open()。...,对应地也需要delete [] 释放 注意: 1、如果存在继承或者对象成员,那么调用构造函数或者析构函数时将有多个,按一定顺序调用,参见这里。...参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

58400

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

运算符重载C++多态的重要实现手段之一。通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能。...一般来说,C++运算符重载可采用成员函数和友元函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。...(1)当重载成员函数时,会隐含一个this指针;当重载为友元函数时,不存在隐含的this指针,需要在参数列表中显示地添加操作数。...(2)当重载成员函数时,只允许右参数的隐式转换;当重载为友元函数时,能够接受左参数和右参数的隐式转换。...,最好将其重载为友元函数;而对于单目运算符,则最好重载成员函数。

2.2K20

C++编程语言中重载运算符(operator)介绍「建议收藏」

本文主要介绍在 C++ 编程语言中使用关键字 operator 重载运算符(也称“重载操作符”)的相关知识,同时通过示例代码介绍使用关键字 operator 重载运算符的具体方法。...1 概述 1.1 What operatorC++ 的一个关键字,它和运算符(如 =)一起使用,表示一个运算符重载函数,在理解时可将 operator 和待重载的运算符整体(如 operator=...使用 operator 重载运算符,是 C++ 扩展运算符功能的方法。...1.3.1 运算符重载实现为类的成员函数 在类体中声明(定义)需要重载的运算符,声明方式跟普通的成员函数一样,只不过运算符重载函数的名字是“operator紧跟一个 C++ 预定义的操作符”,示例用法如下...,则运算符必须被重载为全局函数; C++ 要求’=’、'[]’、'()’、’->’运算符必须被定义为类的成员函数,把这些运算符通过全局函数进行重载时会出现编译错误; 如果有一个操作数是类类型(如 string

2.6K31

C++】运算符重载 ⑨ ( 等号 = 运算符重载 | 调用默认浅拷贝构造函数的情况分析 | 等号 = 运算符重载 与 拷贝构造函数 各自使用场景 | 等号 = 操作符重载步骤 )

博客总结 : 使用 成员函数 进行 等号运算符重载 函数原型如下 : Student& operator=(Student& s) 使用 已存在的对象 A 对 另外一个已存在对象 B 赋值 , B =...---- 1、调用默认浅拷贝构造函数的情况分析 C++ 编译器 为 类 提供的 默认的 拷贝操作 , 是对 成员变量 的简单拷贝 , 是 浅拷贝 ; 在 【C++】深拷贝和浅拷贝 ③ ( 浅拷贝内存分析..., 则将重载函数写在 左操作数 中 , 在 重载操作数的 成员函数中 this 指针就是 左操作数 ; operator=(Student& s) 再后 , 根据业务完善返回值 , 返回值可以是 引用...+ 编译器会自动生成默认的拷贝构造函数 public: // 打印成员变量 void toString() { cout << "m_age = " << m_age << " , m_name...Student 实例对象成员变量值 s.toString(); // 声明 Student 对象 s2 , 并使用 s 为 s2 赋值 // 该操作会调用 默认的拷贝构造函数 // C++

19620

C++】 类与对象——流操作符重载,const成员函数

"月" << _day << "日" << endl; } 我们运行一下却出现了这样的报错,不匹配操作数 这是因为重载函数里面有两个参数(Date* this, ostream& out) 作为成员函数重载...那为了规避这个问题,我们就要把函数中参数的顺序改变,所以我们的重载就不能是成员函数。...我们把重载<<作为全局函数来看呢 这时我们可以正确的输出了,但是代价是我们成员变量改为公有了,不然我们在重载<<函数无法访问成员变量,这就让我们这个类变得不够安全,所以这里使用友元来解决。...const ; // ==运算符重载 bool operator==(const Date& d) const; // >=运算符重载 bool operator >= (const Date...=运算符重载 bool operator !

8810

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

一、一元运算符重载 1、使用 成员函数 实现 前置 ++ 自增运算符重载 使用 全局函数 实现 前置 ++ 自增运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符...++() 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ; // 使用 成员函数 实现 前置 ++ 自增运算符重载 // 重载 前置 ++ 运算符 // 实现 1 个 Student 对象...--() 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ; // 使用 成员函数 实现 前置 -- 自减运算符重载 // 重载 前置 -- 运算符 // 实现 1 个 Student 对象...Student(int age = 1, int height = 1) { this->age = age; this->height = height; }; public: // 打印类数据...指针进行解包 return *this; }; // 使用 成员函数 实现 前置 -- 自减运算符重载 // 重载 前置 -- 运算符 // 实现 1 个 Student 对象 自增运算

14640

C++】类和对象---const成员,取地址及const取地址操作符重载,static成员

⭐const成员 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。...可以,是权限的缩小 ⭐取地址及const取地址操作符重载 这两个默认成员函数一般不用重新定义 ,编译器默认会生成。...class Date { public: Date* operator&() { return this; } const Date* operator&...return this; } private: int _year; // 年 int _month; // 月 int _day; // 日 }; 可以发现,无论写不写这两个重载函数...这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容(不过多介绍)!

9110

从零开始学C++重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器

先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针、当前文件、当前行等信息添加进Trace 成员map容器内,在调用operator delete...定义一个全局Trace 对象,当程序结束,对象析构时判断成员map 是否还有信息,如果有则打印出来,表示已经发生内存泄漏,从输出可以看出是哪一个文件哪一行分配了内存但没有释放掉。...分别重载operator new 和 operator new[]  函数以及对应的delete,更详细的讨论可以参见这里。...当全局对象NewTrace 析构时调用Dump成员 函数,如果new 和 delete 没有匹配,那么map将存在泄漏信息,并打印出来。...#endif 而由于一般的C++库中可能没有#define new new(__FILE__, __LINE__);  即调用的还是原始的new,但现在程序中并没有重载这种类 型的new

79900
领券