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

C++】成员函数重载二元和一元运算符

重载双目运算符时,运算符函数应该具有两个参数,若运算符函数作为类的成员函数(当运算符重载函数作为类的成员函数时,要求操作数左边必须是一个对象,而函数的参数可以是同类的对象也可以是普通的变量),则只需要一个参数...双目运算符 双目运算符就是具有两个操作数的运算符。如 +、-、==等。 对双目运算符而言,成员函数重载运算符的函数参数表只有一个参数,而用友元函数重载运算符函数参数表中含有两个参数。...成员函数重载 == 、>运算符: bool operator==(CTime& time); bool operator>(CTime& time); //判断对象的每个成员变量是否相等...+(int);//后置++,这个int类型的参数只是为了区分,我们并不会使用这个参数,所以我们不需要形参的名字 //前置的++ CTime CTime::operator++() //重载++(前置)运算符...{ CTime time(0,0,1); //定义了一个秒数为1的对象 *this = *this + time;//由于前面的函数已经重载了加号运算符,里面已经定义好了相关的操作,所以这句代码调用了加号运算符的重载函数

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

C++运算符的重载

我们之前提到过C++的函数重载,可以根据形参的不同调用不同的函数,那么运算符重载跟函数重载的实现形式差不多,运算符重载的一般写法为返回值 operator运算符(参数列表)。...首先自定义一个 person 类,通过运算符重载,实现 对person 类的对象 age 属性的一系列操作。...void operator<<(ostream& cout); // 左移运算符重载 }; // 左移运算符重载函数实现,由于 cout 全局只能有一个,若使用值传递的方式,则在传递过程需要进行拷贝...在这里如果对引用不是很清楚的可以移步另一篇文章:C++中指针与引用详解 - ZhiboZhao - 博客园 (cnblogs.com)。...,能够实现 cout << a << b <<...<< endl 的效果,此过程先执行 cout << a,返回值再执行 下一个左移运算符

88000

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

一、运算符重载步骤 1、运算符重载步骤说明 运算符重载步骤 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 , 如 operate+ 是重载加号运算符 ; 然后...使用 全局函数 实现 运算符重载 , 重载 + 运算符 ; 全局函数 实现 运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 , 函数名是 operate...二、友元函数实现运算符重载 1、友元函数实现运算符重载 如果类的成员都是私有成员 , 在 运算符重载 , 需要访问 私有成员 进行计算 , 在 成员函数 , 可以正常访问 私有成员 , 但是...在 全局函数 , 就无法访问 私有成员 了 ; 此时就需要将 全局函数 声明为 类的 友元函数 , 这样才能再 该 全局函数 ( 友元函数 ) 访问 私有成员 ; 类的 成员变量 是 私有成员...; private: int age; // 年龄 int height; // 身高 定义了 全局函数 , 该全局函数访问了 类的 私有成员 , // 使用 全局函数 实现 运算符重载

16240

(转载非原创)C++运算符的重载

我们之前提到过C++的函数重载,可以根据形参的不同调用不同的函数,那么运算符重载跟函数重载的实现形式差不多,运算符重载的一般写法为返回值 operator运算符(参数列表)。...首先自定义一个 person 类,通过运算符重载,实现 对person 类的对象 age 属性的一系列操作。...void operator<<(ostream& cout); // 左移运算符重载 }; // 左移运算符重载函数实现,由于 cout 全局只能有一个,若使用值传递的方式,则在传递过程需要进行拷贝...在这里如果对引用不是很清楚的可以移步另一篇文章:C++中指针与引用详解 - ZhiboZhao - 博客园 (cnblogs.com)。...,能够实现 cout << a << b <<...<< endl 的效果,此过程先执行 cout << a,返回值再执行 下一个左移运算符

75120

C++GDAL:用像素均为0的栅格填补时序遥感数据缺少的时相

本文介绍基于C++语言的GDAL库,基于一个存储大量遥感影像的文件夹,依据每一景遥感影像的文件名中表示日期的那个字段,找出这些遥感影像缺失的成像日期,并新生成多个像元值全部为0的栅格文件,作为这些缺失日期当日的遥感影像文件的方法...其中,关于C++语言配置GDAL库的方法,大家可以参考文章Visual Studio配置C++的GDAL库!。...首先,我们需要基于文件夹遥感影像文件的文件名称特征,遍历生成文件名列表。在这里,我们使用两个嵌套的for循环,生成所有可能的栅格图像文件名,并将这些文件名保存在all_file_path向量。...接下来,我们使用GDALOpen函数,从2018001这一天开始,通过循环打开对应名字的文件,直到找到文件夹第一个实际存在的栅格图像文件(poDataset_actual),并获取其栅格图像的行列数(...我们首先使用GetGDALDriverManager()->GetDriverByName函数获取GDAL驱动程序对象,然后使用CreateCopy函数创建新的栅格图像;其中,我们就是以前期找到的文件夹第一个实际存在的栅格图像文件

20530

C u002F C++ 运算符

算术运算符有两种类型:  一元运算符:操作或使用单个操作数的运算符是一元运算符。例如: (++ , –) 二元运算符:操作或使用两个操作数的运算符二元运算符。...此运算符首先从左侧变量的当前值减去右侧的值,然后将结果赋给左侧的变量。 \ 例子: \   (a -= b) 可以写成 (a = a - b) 如果最初存储在 a 的值为 8。...其他运算符:除了上述运算符,C 或 C++ 还有一些其他运算符可用于执行某些特定任务。其中一些在这里讨论:  sizeof 运算符:sizeof 是 C/C++ 编程语言中经常使用的一种。...要详细了解 sizeof 运算符,您可以访问此链接。 逗号运算符:逗号运算符(由标记 , 表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。...我们可以用条件运算符代替 if..else 语句的使用。要详细了解条件运算符,请访问此链接。 运算符优先级图表 下表描述了 C/C++ 运算符的优先顺序和结合性。运算符的优先级从上到下递减。

54130

C++的四种类型转换运算符

例如,老式的C风格的 double 转 int 的写法为: double scores = 95.5; int n = (int)scores;C++ 新风格的写法为: double...这是因为 C++ 对常量的处理更像是编译时期的#define,是一个值替换的过程,代码中所有使用 n 的地方在编译期间就被替换成了 100。...更多关于 const 的内容请猛击《C++的const又玩出了新花样》。...使用 const_cast 进行强制类型转换可以突破 C/C++ 的常数限制,修改常数的值,因此有一定的危险性;但是程序员如果这样做的话,基本上会意识到这个问题,因此也还有一定的安全性。...在《C++ RTTI机制下的对象内存模型(透彻)》一节,我们讲到了有虚函数存在时对象的真实内存模型,并且也了解到,每个类都会在内存中保存一份类型信息,编译器会将存在继承关系的类的类型信息使用指针“连接

24420

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

运算符重载的通用语法 在重载时,你不能更改 C++ 内置类型的运算符的含义,只能对自定义类型[1]的运算符进行重载。也就是,运算符两边的操作数至少有一个是自定义的类型。...可以被重载的运算符如下: 二元算术运算符 + - * / % += -= *= /= %=;一元前缀运算符 + -;一元前缀后缀运算符 ++ --。...二元位操作运算符 & | ^ > &= |= ^= >=;一元前缀位操作运算符 ~。 二元布尔操作运算符 == != = || &&;一元前缀布尔操作符 !。...., Nov, Dec} 你想为它重载递加和递减运算符,但是你是无法实现它们为成员函数的,因为在 C++ ,枚举类型压根就没有成员函数这一说。...算术运算符 一元自加和后自加运算符,按照前面所说的基本规则,应该实现为成员函数, class X { X& operator++() { // do actual increment

73210

用于动态内存的 C++ 的 new 和 delete 运算符

C/C++ 的动态内存分配是指由程序员手动进行内存分配。动态分配的内存在堆上分配,非静态和局部变量在堆栈上分配内存。 什么是应用程序?...在 C++ 如何分配/释放内存? C 使用malloc() 和 calloc()函数在运行时动态分配内存,并使用 free() 函数释放动态分配的内存。...C++ 支持这些函数,并且还有两个运算符new和delete,它们以更好、更简单的方式执行分配和释放内存的任务。 这篇文章是关于 new 和 delete 操作符的。...如果堆没有足够的内存可供分配,则新请求通过抛出类型为 std::bad_alloc 的异常指示失败,除非“nothrow”与 new 运算符一起使用,在这种情况下它返回一个 NULL 指针(滚动到节的...p) { cout << "Memory allocation failed\n"; } delete 操作符 由于释放动态分配的内存是程序员的责任,因此 C++ 语言为程序员提供了删除运算符

76130

C++避坑---赋值运算符函数的自我赋值和异常控制

b1 = b1------------>b1 = b2 = b2------------>b2 = 从输出结果可以看出,当类B的对象自我赋值的时候,就会出现问题,相信大家一眼就能看出,是由于在赋值运算符函数未进行自我赋值检测...当B& operator=(const B& b)的b与赋值运算符函数的*this(赋值的目的端)为同一对象的时候,语句delete pA;销毁当前对象pA指向的数据,同时也销毁了b的pA指向的数据...a2 b2 = b1------------>b1 = a1, b2 = a1 b1 = b1------------>b1 = a1 b2 = b2------------>b2 = a1 在赋值运算符函数添加自我检测机制...通过拷贝构造函数和交换函数完成了赋值运算符函数的实现,其中交换函数swap(B& b)还可以为其他函数(如移动赋值运算符等)共用,进一步降低重复代码的编写。...来防止自我赋值风险的产生和提高赋值运算符函数的异常控制能力。 参考文献 《Effective C++ 第三版》

38510

C++笔记:运算符重载

C++笔记:运算符重载 引言 函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,做到“一名多用”。 运算符也可以重载,在C++标准库也使用了大量的运算符重载。...将双目运算符重载为友元函数时,形参表列必须有两个参数,形参的顺序任意。...重载运算符的规则 C++ 不允许用户自己定义新的运算符,只能对已有的 C++ 运算符进行重载。 C++ 绝大部分的运算符允许重载。...具有自赋值的二元运算符建议重载为成员函数 += -= /= *= &= |= ~= %= >>= <<= 其他二元运算符建议重载为友元函数 + - * / > < ==...~ (3)含有赋值操作的二元运算符建议重载为成员函数 += -= /= *= &= |= ~= %= >>= <<= (4)其他二元运算符建议重载为友元函数

1.1K20

C++运算符重载详解

可重载的运算符的种类 并不是所有C++运算符都可以支持重载,我们也不能创建一个新的运算符出来(比如Σ)。有的运算符只能作为类成员函数被重载,而有的运算符则只能当做普通函数来使用。...流运算符 描述 值 运算符种类 >> << 是否支持类成员 YES 是否支持普通函数 YES 运算单元 二元 返回类型 左值引用 流运算符C++特有的一种运算符。...为了区分自增和后自增,系统规定对前缀自增的运算符函数上添加一个int类型的参数作为区分的标志。...6.赋值运算符 描述 值 运算符种类 = 是否支持类成员 YES 是否支持普通函数 NO 运算单元 二元 返回类型 左值引用 赋值运算符只能用于类的成员函数不能用于普通函数。...我们知道C++不支持闭包机制,但是在某种程度上来说我们可以借助函数运算符重载的方式来实现这种类似闭包的能力。 10.

1.4K30

C++运算符重载 ⑪ ( 数组类 等号 = 运算符重载 | 函数原型 Array& operator=(Array& a) | 完整代码示例 )

一、数组类 等号 = 运算符重载 1、数组类回顾 数组类 定义后 , 如果 想要 使用 一个已存在的数组类对象 为 另外一个已存在的数组类对象 赋值 , 就需要 重载 等号 = 运算符 ; 重载 等号...= 运算符 , 需要满足如下条件 : 赋值功能 : 基本赋值功能 ; 深拷贝 : 拷贝赋值 需要是 深拷贝 ; 返回引用类型 : 等号运算 是 右结合 的 , a = b = c 代码 , 先执行 b...= c , 然后再执行 a = (b = c) , 可见 等号运算符 的返回值 也要是一个相同类型的对象 , 该对象必须是引用类型 , 否则返回的是一个匿名对象 ; 2、等号 = 运算符重载 使用 成员函数...实现 等号 = 运算符重载 : 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 , 要对 Array a 对象 , 使用 = 运算符 , 使用时用法为...a = a1 ; 左操作数 : 其中 左操作数 是 Array a , 这里通过 this 指针调用 , 不需要声明在参数 ; 右操作数 : 右操作数 是 Array a1 ; 该操作数需要声明在参数

13210

《挑战30天C++入门极限》C++利用构造函数与无名对象简化运算符重载函数

C++利用构造函数与无名对象简化运算符重载函数   在完整描述思想之前,我们先看一下如下的例子,这个例子的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁 //...参数顺序改变后c++无法识别可供使用的运算符重载函数了。   ...我们为了适应顺序问题不得不多加一个几乎一样的运算符重载函数。   ...,但事实上我们仍然觉得是比较麻烦的,例子的情况都还是非成员函数的情况,如果运算符重载函数是作为类成员函数,那么问题就来了,重载函数的第一个参数始终被隐藏,我们无发让int形参排列在隐藏参数的前面,从而导致...a = 10 + a;无法获取正确的运算符重载函数。

45520

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

重载为成员函数: 一般情况下,当一元运算符的操作数,或者二元运算符的左操作数是该类的一个对象时 。...“+”的实现部分 int main() { S obj1(“Visual”), obj2(“C++”); //声明该类的对象同时调用相应的构造函数进行赋值 obj2 =obj1 + obj2; cout...函数原型为:friend 类名 operator运算符(变量表) 注意:友元函数在类的声明与定义是分开的,不可同时进行 例如:复数的加法运算 在这里插入代码片 #include “pch.h”...Complex(){} Complex(int a) { real = a; image = 0; } Complex(int a, int b) { real = a; image = b; } //三个均为构造函数...但在C++不能,下列运算符不能重载为友元函数: = () [ ] ->*

58030

C++ 自增、自减运算符的重载和性能分析

为了区分所重载的是「前置」运算符还是「后置」运算符C++规定: 「前置」运算符作为一元运算符重载,重载为成员函数的形式如下: // 前置自增运算符的重载函数,函数参数是空 T & operator+...+(); // 前置自减运算符的重载函数,函数参数是空 T & operator--(); 「后置」运算符作为二元运算符重载,多写一个没用的参数,重载为成员函数的形式如下: // 后置自增运算符的重载函数...那么问题来了: 为什么「前置」运算符返回的是引用 & ? 为什么「后置」运算符返回的是普通的对象(临时对象)? 主要是因为为了保持原本 C++ 前置和后置运算符的特性。...这说明 (++a) 返回的是自增后 a 变量,a 变量在后续运算过程,a 变量的值会被修改,所以前置运算符的重载函数的返回值必须是引用 &。...---- — 4 — 性能比较 从上面的例子,我们看到「后置」运算符的重载函数的执行步骤: 先要产生一个临时对象来保存未自增或自减的对象; 接着成员变量自增或自减; 最后返回修改的对象(临时对象);

1.1K20

C++求值顺序

《C++Primer5th》中文版第124页 C++语言没有明确规定大多数二元运算符的求值顺序, 给编译器优化留下了余地。...3.C++手册 几乎所有 C++ 运算符的求值顺序(包括函数调用表达式的函数参数求值顺序和任何表达式中子表达式的求值顺序)都是未指定的。...4.序列点规则(以下内容来自C++手册) 序列点规则 (C++11 ) 定义 求值可能产生副效应:即访问 volatile 左值所指代的对象、修改对象、调用库 I/O 函数或调用做任何这些动作的函数...序列点( sequence point )是执行序列的点,在该点所有来自序列先前求值的副效应均已完成,而后继求值的副效应都未开始。...4) 一旦函数执行开始,则在被调用函数完成,不求值来自调用方函数的表达式(函数不能交错)。 5) 每个使用内建(非重载)运算符的下列四种表达式的求值,表达式 a 的求值后有一个序列点。

1.3K20

C++ 炼气期之算术运算符

Tip: 可以把C++运算符看成一种特殊语法格式的函数,或把C++的函数当成一种特殊的运算符。 在使用运算符时,需要遵守下面的 2个基本原则: 运算符对操作的数据有内置的类型要求。...逗号运算符。 使用运算符,需要理解如下几个概念: 运算符的优先级:不同类别运算符的优先级是不相同的。当在一个表达式中出现多个运算符时,则需要根据运算符的优先级进行先后运算。...运算符的操作数:作用于一个操作数的运算符为一元运算符,作用于两个操作数的运算符二元运算符C++还有一个可作用于三个操作数的条件运算符。...Tip: 只有当两个运算符作用于同一个操作数时,优先级和结合性才有意义。 C++的基础运算符较多,且因C++是弱类型语言,每一种运算符在使用过程中都存在很多细节问题。...3.2 运算符重载问题 C++可以重载运算符,所谓重载运算符,指同一个运算符可以根据使用时的上下文信息,表现出不同的运算能力。如-运算符, 当作为二元运算符时,用来对操作数进行相减操作。

53830
领券