c++操作符重载,拷贝构造函数和友…

c++ 实现双向链表构造函数,拷贝构造函数,析构函数,输出操作符重载,赋值操作符重载,头插尾插,头删尾删,任意位置插入,任意位置删除,查找等 构造函数,拷贝构造函数,析构函数,输出操作符重载,赋值操作符重载,头插尾插,头删尾删,任意位置插入,任意位置删除,查找等 阅读详情

操作符重载

把c++的操作符在自己的新函数中重新实现就是操作符重载。

可以在类里面以成员函数的方式重载某个操作符,也可以在某个名字空间中重载操作符。

 

--------------------------------------------------

以赋值操作符为例,函数的声明以及函数的调用

class A

{

public:

    A& operator=(const A& a);

};

 

实现了这个函数之后,再 写代码

A a;

A b;

a = b;

则相当于 a.operator=(b) 被执行。

1,函数执行时,this对象是赋值操作符的左操作数,参数是右操作数, -- 这一点对于任何在类成员函数重载的有两个操作数的操作符都成立。

2,如果操作符是在名字空间中被重载,那么赋值操作符函数有两个参数,第一个参数是左操作数,第二个参数是右操作数。

--------------------------------------------------

A& operator=(const A& a)这个函数的实现:

 

A& A::operator=(const A& a)

{

      要根据a的值来修改this对象的值,

      然后返回this对象的引用。

}

需要注意的地方

1,如果this对象中有成员变量是指针,那么有两种选择需要程序员根据实际情况做决定,一种是直接指针赋值,第二种是释放掉this对象的该成员变量指针的内存,重新分配,再赋值。而对于拷贝构造函数,一般的实现都是选择第二种情况。

2,要检查a是否和this对象是同一个对象,如果是的,就什么也不用做。

 

--------------------------------------------------

赋值操作符重载之后,什么时候会被调用

1,对于已经的对象的赋值才会被调用

2,相反,如果对象还不存在,则是拷贝构造函数被调用,如

A a;

A b=a;

这时候其实是拷贝构造函数会被调用,而不是赋值操作符会be调用。

 

--------------------------------------------------

哪些操作符不能被重载

 

&&,||以及,

原因:布尔值的&&以及||符号的运算在c++中采用的是简化求值法,即:从左到右,只要布尔值的真假被确定,剩下的表达式是不用计算的。

 

例如 if(p && p->func()),按照c++的&&操作符的实现,如果p为空指针的时候,只会对p以及&&进行计算,而p->func()不会被计算。

 

但如果是以成员函数的形式重载了重载了&&操作符函数,那么相当于执行 p.operator&&(p->func()),此时参数会被求值。那么如果p是空指针,该代码执行就会触发异常。

 

--------------------------------------------------

友元成员函数

 

clas A

{

 friend void fun(const A&);

};

void fun(const A& a)

{

//实现代码

}

友元成员函数能让该函数的代码访问A类型的成员变量。

 

--------------------------------------------------

为什么要用友元函数,而不是声明为成员函数

 

一般是不用友元的,但有时候只能用友元,比如operator<<,这是c++的输出操作符,

使用方式是

A a;

std::out << a;

如果类型A想要重新实现输出的行为,有三种选择,但只有友元这种是可行的

1,以成员函数的方式来定义operator<<(),问题是在操作符运算被执行的时候,this指针是左操作数,参数是右操作数,那么在std::out << a; a对象就是参数,而不是this指针,因此A类型所声明的成员函数不会被调用。

2,以全局的方式来声明定义operatr<<(ostream& out, const A& a),这时,在执行std::out << a 的时候,左操作数是第一个参数,右操作数是第二个参数,该函数“可以”被调用,但是,因为这个函数不是A类型的成员函数,它无法访问A类型的成员,因此这种方式不会通过编译,

3,那就是在2的基础上,将函数声明为A类型的友元函数了。

 

对于不同类型之间operator+运算也因为同样的原因需要声明为友元函数。

 

电力电子技术速通复习 一种完全纯净,结构完整的半导体晶体,其含有两种载流子而且,自由电子的浓度和空穴的浓度总是相等,一般情况下,在硅晶体中掺入P(磷)五价元素,多子为自由电子,少子为空穴;在硅晶体中掺入B(磷)三价元素,多子为空穴,少子为自由电子;6.PN结具有单相导电性,PN结具有雪崩击穿(T越高,击穿电压越大)和齐纳击穿(T越高,击穿电压越小),均可逆,热击穿不可逆;PN结具有电容效应,势垒电容(耗尽层变化等效的电容)扩散电容(非平衡少子引起的电荷量的变化等效出来的电容效应) 阅读详情

相关推荐

SkyWalking跨线程Trace传递实战:手把手教你用RunnableWrapper解决异步链路中断问题

本文深入解析了SkyWalking在异步编程场景下链路追踪中断的根源,并提供了使用RunnableWrapper等官方包装类的实战解决方案。通过详细的原理解析和代码示例,手把手指导开发者如何实现跨线程的Trace传递,确保分布式系统监控链路的完整性,有效解决异步任务导致的链路中断问题。

sand8的博客 495

C++ 复制构造函数和运算符重载示例

string1.h // // Created by lance on 10/16/18. // #ifndef CPP_PRIMER_STRING1_H #define CPP_PRIMER_STRING1_H #include &lt;iostream&gt; using std::ostream; using std::istream; class String { privat...

lance_wyvern的博客 300

Qt实战:用QTreeView+QStandardItemModel实现多级多列文件浏览器(附完整代码)

本文深入探讨了使用Qt的QTreeView与QStandardItemModel构建多级多列文件浏览器的完整实践。通过分析模型/视图框架的优势,详细演示了从基础框架搭建、模拟数据填充,到对接真实文件系统实现懒加载的全过程。文章还涵盖了自定义委托、多列排序、右键菜单等高级定制技巧,并提供了性能优化建议和完整的代码示例,帮助开发者打造功能强大且高效的工业级文件管理界面。

weixin_29021291的博客 424

拷贝构造函数与运算符重载(c++详解)

拷贝构造函数与运算符重载拷贝构造函数引出拷贝构造函数运算符重载引出拷贝构造函数 拷贝构造函数引出 先给出日期类的定义: class Date { public: Date(int year=1900,int month=1, int day=1) { _year = year; _month = month; _day = day; } void print() { cout << _year << " " << _month &l

qq_45928272的博客 3784

星空组网 vs 蒲公英 vs Tailscale:2024年国内免费异地组网工具横评(含实测数据)

本文对2024年国内主流免费异地组网工具星空组网、蒲公英和Tailscale进行了深度横向评测。基于实测数据,重点分析了三者在P2P成功率、中继延迟、传输速度及稳定性方面的表现,为中小企业、远程办公及个人开发者提供了清晰的选择指南。星空组网在国内网络环境下展现出优秀的平衡性。

weixin_29217235的博客 1440

Android HDMI-CEC协议解析:从机顶盒到电视的无缝遥控联动

本文深入解析Android HDMI-CEC协议,实现机顶盒与电视间的无缝遥控联动。通过剖析设备角色、消息格式及核心操作码,并结合Android HdmiControlManager API实战,详细讲解如何实现电源同步、按键穿透及音量控制,最终解决多设备遥控繁琐的痛点,提升用户体验。

egg99的博客 974

C++笔记:拷贝函数和移动函数

拷贝构造函数: 在初始化一个类类型时,如果调用拷贝构造函数,就会把传入的参数先拷贝一份副本,再用此副本来进行初始化,格式一般是 class(const class&),一般在用 = 定义变量时使用,如 my_class s1 = s2;此时会调用拷贝构造函数,这里的参数得注意,一定得是引用类型的,假如是非引用的,则你调用拷贝构造函数时,我们需要拷贝它的实参,但为了拷贝实参,我们又需要调用拷贝构造

tomato。 3101

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

一、提供默认赋值运算符重载函数的时机 当程序没有显示地提供一个以本类或者本类的引用为参数的赋值运算符重载函数时,编译器会自动生成这样一个赋值运算符重载函数。#include <iostream> using namespace std;class Data { public: Data() {} Data(int _data) :data(_data) {

syeming的编程专栏 8749

SAP HR模块配置假期日历和缺勤类型

SAP的HR模块。业务顾问在实施时一般会配置未来10年的假期日历,到期后再进行配置。同时,增加请假类型(缺勤信息类型)。记录这一过程。

福来阁86号技师的妖孽日常 5525

SAP 采购员参数及权限配置

若要控制采购员的参数缺省值或者权限,可以通过以下方式实现: 1、定义采购员缺省值(EVO) 路径:后台----物料管理---采购---环境数据---定义采购员的缺省值 点击图标,显示如下,查看参数配置ID: 查询到配置“定义采购员的缺省值”是通过ID “EVO”来配置的。进入页面建立配置: 按照需要配置新条目: 事务代码SU01进入用户配置页面,在用户“参数”页面配置前面设...

willieyuan的博客 7601

C++类和对象 -下 默认成员函数和初始化列表

一个类中什么成员都没有,简称为空类。但是空类中真的什么都没有吗? 答案:并不是的,任何类在什么都不写时也是有东西存在的,就是我们今天要学习的类的六个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 六个默认成员函数分别是:构造函数、析构函数、拷贝构造函数、赋值重载、普通对象取地址重载、const对象取地址重载

JuLiJuLi.的博客 971

【变化检测】变化检测相关数据集+代码+论文合集

光学影像变化检测领域数据集(有label的,无label的)、高光谱影像变化检测领域数据集、3D变化检测领域数据集、传统变化检测算法、深度学习变化检测算法、SAR变化检测算法、高光谱变化检测算法论文及代码等资源。

向上生长的程序媛的博客 2089

C++类和对象(三)——拷贝构造函数及操作符重载

我们本文接上文继续聊C++中类和对象的知识本期要点:拷贝构造函数及操作符重载。

m0_75262940的博客 1817

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

2302_79988283的博客 3194

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。这样写才是拷贝构造,通过同类型的对象初始化构造,而不是指针。这里可以完成拷贝,但是不是拷贝构造,只是⼀个普通的构造。也可以这样写,这里也是拷贝构造。

2401_86551514的博客 2817

【C++】类和对象(中)之拷贝构造与运算符、操作符重载

拷贝构造和运算符重载深度讲解,干货满满,收藏走起~!

℉f的博客 922

【C++】拷贝构造函数与运算符重载

本篇笔记主要记录:拷贝构造函数与运算符重载(包含赋值运算符重载)(operator)的知识。里面记录了拷贝构造的各种细节,也有运算符重载的细节知识,其中也包含了默认成员函数的赋值运算符重载。深入浅出。(更新流插入与流提取的重载运算符)

Bucai_不才的博客 2252

拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载

在我们学习C++的过程中,我们难免会遇到类,在类中有6个默认的函数,它们分别为:构造函数、拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载。

痴心不改的博客 1237

【C++入门】拷贝构造&&运算符重载

拷贝构造和运算符重载是面向对象编程中至关重要的部分,它们C++编程中的一个核心领域,本期我详细的介绍拷贝构造和运算符重载。拷贝构造函数和运算符重载是 C++ 中重要的语言特性,掌握它们对于理解和设计复杂的程序非常重要。

2202_75605090的博客 1290

c++操作符重载

容器对象list和vector使用时遇到find函数报错,那么问题的最终解决方案在操作符重载,这里就顺便将操作符重载的相关内容都详细介绍一遍,并给出实例代码

河西~石头 1697

C++中的操作符重载

1.概述  C++中对类对象(抽象数据类型实例)的操作通过向对象发送消息完成,使用C++的操作符链接用户自定义类型对象的过程叫做操作符重载,编译器在处理表达式时,会根据操作符的使用方式生成合适的代码。   C++强大的功能不仅在于用户可以自己定义新的类型,还表现在允许重载现有的大多数操作符,使这些操作符可以与类对象结合使用,给操作符赋予新类型的含义。   操作符重载通过编写函数定义实现,被

JBuilder3的专栏 1965

再看C++中的赋值操作符重载和拷贝构造函数

C++中默认的赋值操作符

大冰的小屋 1006

C++重载赋值操作符

重载赋值操作符重载赋值操作符 重载赋值操作符 赋值操作符“=”可以用来将一个对象拷贝给另一个已经存在的对象。如果我们重新定义了一种新的数据类型,比如说复数类,那么我们就需要重载一下赋值操作符,使之能够满足我们的赋值需求。 当然,拷贝构造函数也有同样的功能。拷贝构造函数可以将一个对象拷贝给另一个新建的对象。如果我们没有在类中显式定义拷贝构造函数,也没有重载赋值操作符,那么系统会为我们的类提供一个默认的拷贝构造函数和一个赋值操作符。前面在介绍类的相关知识时已经提到,系统为我们提供的默认拷贝构造函数只是将源对象中

嵌入式与人工智能 1994

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

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

zhang_si_hang的博客 3378

操作符重载

操作符重载 操作符重载是一个大坑,不同符号重载的规则有不同的限定。让我们一个一个填坑吧。 重载的基本方法 重载可以定义在类里,也可以定义成全局函数并加上友元。比如,同样是加操作,可以 class Complex{ ... Complex operator+(Complex&); }; Complex Complex::operator+(Complex &x){ ... } //或者 class Complex{ friend Complex ope

wuyihao123的博客 5442

CPP中重载赋值操作符

在CPP中,析构函数,拷贝构造函数和赋值操作符的重载总是绑定在一起的。 一、几个问题 1、赋值操作符重载函数 参数为:const Test& obj,加上const的原因是我们不希望此函数对用来进行赋值的obj进行任何修改,其次加上const的形参,能接受const和非const的实参,反之只能接受非const的实参。 返回值为:Test&,返回值是返回被赋值着的引用,即*this,这样可以实现连续复制,类似 t2 = t1 = t3。如果...

qq_40467692的博客 541
上一篇: 设计模式,我理解的代理模式
下一篇: 基于协同过滤算法的推荐系统
upnow2014
博客等级 码龄12年 14粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值