深入讨论构造函数和运算符重载

结构体的运算符重载 C++ 中,结构体是无法进行==,>,<,>=,<=,!=操作的,如果要使用这些操作符对结构体进行操作,则可以在结构体内部对这些运算符进行重载,将结构体的比较转化为结构体内部的数字或者字符的比较。 实际编程中,大部分时候操作对象是结构体数组,尤其是在使用STL容器的时候,如果我们可以往语句中传入结构体,一些事情将会变得很简单。因此掌握结构体运算符的重载是非常必要的。 方式一:结构体内部的重载 重载运算符的格式如下: bool operator运算符 (const 结构体名称 b)c 阅读详情

一、构造函数

(一)复制构造函数(深拷贝和浅拷贝)

1、构造拷贝函数:用一个已有的对象,构造和它同类型的副本;
 class xxx { xxx (const xxx &that) {...} };
 &that是引用,拷贝构造函数推荐使用引用,如果直接传递值,那么会导致无限递归;
2 、如果一个类没有定义拷贝构造函数,系统会提供一个缺省拷贝构造函数:值的简单复制
        缺省拷贝构造函数对于基本类型的成员变量,按字节复制;

        对于类类型成员变量,调用相应类型的拷贝构造函数

3、 在某些情况下,缺省拷贝构造函数只能实现浅拷贝,如果需要获得深拷贝的复制效果,就需要自己定义拷贝构造函数;

 一般下面两种情况需要自定义拷贝构造函数:

        如果成员里面包含指针或者引用;

        如果成员对象指向 new 地址;

拷贝函数被调用的情况有:
1,定义新对象,并用已有对象初始化新对象时; 即执行语句“CExample B=A; ” 时(定义对象时使用赋值初始化);

2,当对象直接作为参数传给函数时,函数将建立对象的临时拷贝,这个拷贝过程也将调同拷贝构造函数。 

例如:
        BOOL testfunc(CExample obj)
       {
            //针对obj的操作实际上是针对复制后的临时拷贝进行的
       }
       testfunc(theObjone); //对象直接作为参数,拷贝函数将被调用;
3,当函数中的局部对象被返回给函数调者时,也将建立此局部对象的一个临时拷贝,拷贝构造函数也将被调用 ;
    例如:
    CTest func()
    {
        CTest   theTest;
        return   theTest
     }  

(二)复制赋值运算符函数

1、为什么要对=赋值操作符进行重载?
答:接上面的例子,用户在使用语句ObjB = ObjA的时候,或许ObjB的pStr已经指向了动态申请的空间,如果直接简单将其指向的地址覆盖,就会导致内存泄露,所以需要对=赋值操作符进行重载,在重载函数中判断pStr如果已经指向了动态申请的空间,就先将其释放。
2、拷贝构造函数和=赋值操作符重载的关系。
答:从原文的例子中可以看出,=赋值操作符重载比拷贝构造函数做得要多,它除了完成拷贝构造函数所完成的拷贝动态申请的内存的数据之外,还释放了原本自己申请的内存空间。所以原文最后给出的拷贝构造函数的实现可以使用=赋值操作符的重载来完成。

转载网址:https://blog.youkuaiyun.com/gxtdjh/article/details/6653499

(三)临时对象的构造函数(???)

二、运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 

  运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:

   

<返回类型说明符> operator <运算符符号>(<参数表>)
{

     
<函数体>

}

 运算符重载时要遵循以下规则:

(1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载。

(
2) 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。

(
3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。

(
4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。

(
5) 运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。

(
6) 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。

  运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(可以把一个运算符作为一个非成员、非友元函数重载。但是,这样的运算符函数访问类的私有和保护成员时,必须使用类的公有接口中提供的设置数据和读取数据的函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)   

成员函数运算符

 运算符重载为类的成员函数的一般格式为:

    
<函数类型> operator <运算符>(<参数表>)

    
{

     
<函数体>

    }

  当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:

(1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。

(
2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。

(
3) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

    调用成员函数运算符的格式如下:

    
<对象名>.operator <运算符>(<参数>)

    它等价于

    
<对象名><运算符><参数>

    例如:a
+b等价于a.operator +(b)。一般情况下,我们采用运算符的习惯表达方式。

友元函数运算符

 运算符重载为类的友元函数的一般格式为:

    friend 
<函数类型> operator <运算符>(<参数表>)

    
{

     
<函数体>

    }

  当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。

 调用友元函数运算符的格式如下:

    
operator <运算符>(<参数1>,<参数2>)

    它等价于

    
<参数1><运算符><参数2>

    例如:a
+b等价于operator +(a,b)。

两种重载形式的比较

  在多数情况下,将运算符重载为类的成员函数和类的友元函数都是可以的。但成员函数运算符与友元函数运算符也具有各自的一些特点:

(1) 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。

(
2) 以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。

(
3) 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。

(
4) 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。

(
5) 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。

(
6) 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一 个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部 类型的对象,该运算符函数必须作为一个友元函数来实现。

(
7) 当需要重载运算符具有可交换性时,选择重载为友元函数。

转载网址:https://blog.youkuaiyun.com/zgl_dm/article/details/1767201

类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则 文章目录构造函数默认构造函数的三种不适用情况第一种第二种第三种 class Date { }; 可以看到,上面那个类没有任何成员,是一个空类,但是它真的什么都没有吗? 其实一个类在我们不写的情况下,也会生成6个默认的成员函数,分别是:构造函数,析构函数,拷贝构造函数,赋值运算符重载,取地址运算符重载,对const对象取地址运算符的重载 构造函数 构造函数是特殊的成员函数,它的主要功能就是初始化对象。和我们之前c语言中自己实现的init函数类似。但是有一点不同的是,init是在我们创建完后才自己调用, 阅读详情

相关推荐

无人驾驶小车调试笔记(六)-- 车轮校准

简介:小车的动力完全来自于两个电机带动的车轮,在理想状态下,给两个电机同样的驱动参数,两个车轮会以同样的转速带动小车直线行驶,而实际情况是每个电机可能都会有个体差异,也就是说给予同样的驱动参数,表现出的转动速度会有些许不同,两个轮子的差速会导致车辆拐弯,后果就是给了直线行驶的控制命令,但是车走着走着就偏离了原本的方向,所以在开始控制之前,我们需要先平衡两个车轮的转速,保证在同样驱动参数下,两个车轮转速大致相同,也就是可以走直线。 车轮校准分为3步,测试、调整后再测试、保存参...

aibingjin的博客 1820

构造函数的重载

(一)重载函数条件 (1)函数名相同 (2)函数参数不同(一下两个满足其中一个即可) 1)函数参数个数不同 2)函数参数类型不同 注意:函数返回值不同不能作为函数重载条件 重载:根据函数参数个数和参数数据类型来自动调用哪一个重载函数 (二)构造函数的重载 1)默认/缺省构造函数 (1)如果没有构造函数,系统会提供一个默认的构造函数帮助创建对象 (2)默认构造函数没有参数 2)复制/拷贝构造函数 用对象初始化另一个对象,需要用到复制构造函数 (1)作用:用一个已知的对象初始化另一

qq_45288949的博客 6721

告别IMEI!手把手教你用UUID实现Android设备唯一标识(兼容Android 10-13)

本文详细探讨了在Android 10及以上版本中,如何构建合规且高可用的设备唯一标识方案以替代被限制访问的IMEI。文章深入分析了Android设备标识符的演变,并提供了基于UUID/GUID的完整实现策略,包括生成算法、多级持久化存储方案(如MediaStore)、权限处理以及版本兼容性实践,帮助开发者应对Android 10-13的隐私政策变化。

weixin_28339967的博客 574

结构体中运算符的重载

https://blog.youkuaiyun.com/sunny1996/article/details/51242184 结构体内重载操作符时注意  函数的参数,通常为结构体内定义的变量-1个   法2  结构体内部 定义 cmp 比较函数 bool compare(const PAIR &amp;x, const PAIR &amp;y) { return x.point_value &gt...

gml1999的博客 653

AI Agent在营销领域的实战策略

本文从第一性原理出发,系统性拆解AI Agent在营销领域的落地逻辑、技术架构、实现方案与实战策略。全文覆盖从基础概念到高级优化的全层级知识:底层理论层面推导营销Agent的效用函数与决策框架;技术架构层面提出"感知-记忆-规划-行动-反思"五组件可落地架构;实践层面提供生产级代码实现、多行业案例与ROI提升方法论;前沿层面探讨多Agent协同、世界模型仿真等下一代技术方向。

操作系统内核探秘的博客 227

用友BIP培训资料-设计采购订单新增API接口开发

14.在子实体的String pkMeas = order_hhrSlave0VOJson.getString("pk_meas");Openapi路径:nccloud/api/pu/order_hhrmanage/order_hhrMaster/addAggOrder_hhrMasterVO。实现接口的开发部署,通过openAPI的test类,实现一条数据的插入。16.进入自己的Idea打开老师发的TestOpenApi并且编译完成后如下。12.编写检测是否字段中是否含有中文的方法。

m0_68497879的博客 1546

C++入门:构造函数,析构函数,拷贝构造函数,运算符重载详解

目录 类的6个默认成员函数 一.构造函数 1.概念 2.特征如下: 1. 函数名与类名相同。 2. 无返回值。 3. 对象实例化时编译器自动调用对应的构造函数。 4. 构造函数可以重载。 5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。 6. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。 7. 关于编译器生成的默认成员函数,很多同学会有疑惑: 8. (了解)C++11打的..

zhang_si_hang的博客 3378

果蔬及菜品识别系统

果蔬及菜品识别系统

我的博客 2120

构造函数的三个作用,()运算符的重载,*和->运算符的重载

文章目录后置++有两个参数运算符的重载什么时候以引用返回什么时候以值的形式返回一,构造函数的三个作用: 后置++有两个参数 运算符的重载什么时候以引用返回什么时候以值的形式返回 返回的是*this就以引用返回这样可以少创建对象提高效率; 返回的是重载里面新创建的对象就以值的形式返回; 一,构造函数的三个作用: 创建对象,对象初始化,类型转换(要实现类型转换构造函数只能是单参的) class Int { private: int Value; public: Int(int x = 0) :Value(

weixin_45510561的博客 611

ROS2 CANopen 使用教程

第一步是定义一个结构,用于保存有关接头和相关 CANopen 数据的信息。该结构是 CANopen 网络的基础,可确保存储所有相关数据并在需要时进行访问。

机器人控制与仿真应用 3690

GameFramework教程✨六、怎样加载一个3D UI

怎样加载一个3D UI

星河造梦坊 1583

C++:拷贝构造函数和赋值运算符重载

6. 虽然编译器会生成默认的拷贝构造函数,但仅仅会完成浅拷贝,如果拷贝的函数涉及空间申请(如stack),则会出现错误(两个函数会申请到同一块空间,销毁时会出现同一块空间释放2次,导致程序崩溃)。: 编译器自动生成的赋值运算符重载是浅拷贝,对于无空间申请的函数可以(如Date),对于有空间申请的函数就不可以(如Stack),必须自己写。上图中,我故意将减法重载成加法,Sum执行的+是我重载的减法,但b执行的还是加法,说明内置类型的运算符不受重载运算符的影响。

2302_79988283的博客 3193

【26美赛F题 To Gen-AI, or Not To Gen-AI】(MCM/ICM)思路解析及代码分享

摘要:本文研究生成式人工智能(Gen-AI)对三类职业(STEM、技能型工艺、艺术)的影响,建立量化模型预测未来10-20年岗位需求变化。通过分析AI替代效应($R_{sub}(t)$)和增强效应($R_{enh}(t)$),提出差异化高校课程调整策略:STEM专业需加强AI集成能力,技能型工艺专业应结合智能工具与实操训练,艺术专业需平衡AI创作辅助与原创性培养。模型表明,高校通过针对性课程优化可提升毕业生在AI时代的就业竞争力,为教育决策提供数据支持。(149字)

一键难忘的博客 636

【C++基础(七)】类和对象(中) --拷贝构造,运算符重载

C++类和对象拷贝构造函数和运算符重载讲解,深浅拷贝问题和拷贝构造为什么一定要传引用问题,拷贝构造和赋值运算符的区别以及使用场景.前置++和后置++运算符重载的区别以及

杭电码农-NEO的博客 1158

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++——运算符的重载

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。让类类型的对象像基本数据类型一样去操作 例如:可以实现对象+,-* / % ==!运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该重载的运算符时调用此函数。这个函数叫做运算符重载函数,通常为类的成员函数。定义运算符重载函数的一般格式:返回值类型 类名::operator重载的运算符(参数表) {……}operator是关键字,它与重载的运算符一起构成函数名。

weixin_59179454的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C++】类和对象(中)---拷贝构造函数、赋值运算符重载

【类和对象】六大默认成员函数中的拷贝构造函数、赋值运算符重载的详细介绍。

m0_74352571的博客 1906

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++运算符重载

本文是作为C++类与对象文章的补充,后续还会补充其他内容。借助关键字operator进行重载,格式如图3所示:[返回类型] operator[重载运算符](参数)在开始介绍之前,要先解释一下本文的日期类是什么意思,日期类就是字面意思一个描述日期的类,什么是类来着??(如果你忘记了,可以看看博主的这篇文章click_me),类是一种由用户定义的自定义类型,对于一个类而言其不仅仅有成员变量还有成员函数,而类的精华就在于其成员函数(成员变量也很重要!!!

m0_73987904的博客 1096

C++丨10丨运算符重载

运算符函数是一种特殊的成员函数或友元函数。

随便塞学习记录的地方 214

拷贝构造函数和运算符重载

拷贝构造函数和运算符重载的使用,拷贝构造函数和赋值运算符重载编译器都是可以默认生成的,然后对于拷贝构造函数特性进行讲解,还有前置++和后置++重载的性能比较

小王学代码 1213

Chapter 9 运算符重载

如果将运算符“+”函数重载为类的成员函数,交换律不适用,所以因为这些原因,是将双目运算符函数重载为友元函数,单目运算符则多重载为成员函数。如果运算符函数重载为成员函数,它的第1个参数必须是本类的对象,当第1个操作数不是类对象时,不能将运算符函数重载为成员函数,a:运算符重载的函数作为类的成员函数:如果将运算符重载函数作为成员函数,他。2.函数重载:就是对一个已有的函数赋予新的含义,使之实现新的功能,因此,b:运算符重载的函数不是类的成员函数(可以是一个普通函数),

2301_80903601的博客 1145

C++ 运算符重载

目录一:运算符重载的方法二:运算符重载的规则:三:重载=运算符、重载构造函数实现含动态内存申请的赋值、复制1.重载=的体外实现2.复制构造函数的体外实现:四:运算符重载作为类成员函数和友员函数1.成员函数与友员函数的区别: 一:运算符重载的方法 形式: 对象 运算符 另一个值(可以不是对象,可以无)被解释为:对象.operator运算符(另一个值) 运算符被重载后,原来用于其他数据类型上的功能仍然被保留(重载),系统根据重载函数的规则匹配 例:复数的相加 二:运算符重载

weixin_51252109的博客 471

设计一个简单的时间类——了解运算符重载和友元函数

运算符重载,友元函数

qq_43067403的博客 1277

C++核心编程——详解运算符重载

C++的一大特性就是重载,重载使得程序更加简洁高效。在C++中不只函数可以重载,运算符也可以重载,运算符重载主要是面向对象之间的。运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载语法: 在C++中,使用operator关键字定义运算符重载。运算符重载语法格式如下: 函数的参数列表中参数个数取决于两个因素。通过案例两个对象相加演示“+”运算符的重载: 通过上面案例可以知道,重载运算符并没有改变其原来的功能,只是增加了针对自定义数据类型的运算功能,具有了更广泛的

阿标de杂货铺 1594

缺省参数+函数重载+构造函数+运算符重载

自动生成第一种调用系统默认的无参构造函数第二种自己实现无参构造函数class Dateprivate:int _year;int _month;int _day;_month = 1;_day = 2;_day = day;void Print()//打印函数int main()Date d1;d1.Print();d2.Print();return 0;第三种利用全缺省的构造函数class Date。

m0_63783532的博客 1939

C++(运算符重载,运算符重载的两种方式详解)

运算符重载基础知识 固定用法: 类内声明: bool operator>=(const Student&) const; 初始化: bool Student::operator>=(const Student& stu) const {//常成员函数,功能:比较两个对象的数据成员dScore大小 return this->dScore >= stu...

Scott_NoTag 5629

第5章 运算符重载

纯单目运算符,只能有一个操作数,包括:!、~、sizeof、new、delete 等纯双目运算符,只能有两个操作数,包括:[]、->、% 、 = 等三目运算符,有三个操作数,如“?: ”既是单目又是双目的运算符,包括: + 、 - 、 & 、 * 等多目运算符,如函数参数表 “()”。左值运算符是运算结果为左值的运算符,其表达式可出现在等号左边,如前置 ++、-- 以及赋值运算 = 、 += 、 *= 和 &= 等。

qq_43010742的博客 1049
上一篇: C++面向对象基
下一篇: C++继承预习
linuxwln
博客等级 码龄9年 30粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值