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

【C++】字符串中运算符的重载问题 字符串中运算符的重载问题 运算符的重载: 运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该重载的运算符时调用此函数。这个函数叫做运算符重载函数,通常为类的成员函数。 定义运算符重载函数的一般格式: 返回值类型 类名::operator重载的运算符(参数表){……} 在字符串中,运算符的重载问题在于字符串和字符串之间进行计算。 首先我们定义一个字符串的类,并为其写出构造函数、拷贝构造函数,析构函数、打印字符串函数。 class String { private: char 阅读详情

拷贝构造函数应用的场合由以下几个方面:

1 函数的参数是一个对象,并且是值传递方式

2 函数的返回值是一个对象,并且是值传递方式

3 用一个对象初始化另外一个对象

 

由此,当函数的参数或者返回值为一个对象时,使用的时候要小心,因为值传递的时候执行的是位拷贝,并不会调用对象的构造函数,也就是说生成的临时对象可能不是正确初始化的,这样就可能会出现一些意向不到的问题。当返回值是个对象和用一个对象初始化另外一个对象时的情况是相同的。

比如如下代码:

#include <iostream>

 

using namespace std;

class CTest

{

public:

    int i;

    CTest(){cout << "construct" << endl;}

    ~CTest(){cout << "discontruct" << endl;}

};

 

void test(CTest obj)

{

    

}

 

int main()

{

    CTest testObj;

    test(testObj);

    return 0;

}

 

这个程序运行的结果为:

construct
discontruct
discontruct

调用了一次构造函数,调用了两次析构函数。声明testObj对象时,调用了一次构造函数。当testObj以值传递的方式传入test函数时,此时会生成一个CTest类型的临时变量,但是此时编译器采用的是位拷贝的方式,并不调用CTest类的构造函数。当test函数退出时,生成的临时变量生命周期结束,调用一次析构函数,当main函数退出时,testObj变量生命周期结束,调用一次析构函数。所以出现上面的输出。

正确的解决方法是定义一个拷贝构造函数。

 

拷贝构造函数的类型为:YourClass&(YourClass& object);

修改后的代码为:

 

#include <iostream>

 

using namespace std;

class CTest

{

public:

    int i;

    CTest(){cout << "construct" << endl;}

    CTest(CTest& obj){cout << "call copy construct" << endl;}   //拷贝构造函数

    ~CTest(){cout << "discontruct" << endl;}

};

 

void test(CTest obj)

{

    

}

 

int main()

{

    CTest testObj;

    test(testObj);

    return 0;

}

此时程序的输出为:

construct
call copy construct
discontruct
discontruct

当用一个对象初始化另外一个对象时,也对调用拷贝构造函数。

如

CTest test1;

CTest test2 = test1;    //调用test1的拷贝构造函数初始化对象test2

但是对于下面的表达式:

CTest test1,test2;

test2 = test1;

却不会调用CTest的拷贝构造函数,因为test2已经被初始化过了,此时如果想要正确对test2赋值,需要重载运算符=

运算符重载的方式为 :

YourClass& operator=(YourClass& obj)

{

    return *this;

}

 

虽然不编写拷贝构造函数和重载运算符=,在大部分的情况下代码都能正常工作,因为编译器会生成一个默认的拷贝构造函数并且在对象赋值的时候也会作些特殊处理。但是我们不能完全相信系统始终能正常理解你的代码。所以让代码完全在自己的控制之下才是一个好的方法。所以时刻不要忘记编写拷贝构造函数和重载=

MATLAB双目相机标定:从工具箱实战到参数精解 本文详细讲解了使用MATLAB进行双目相机标定的完整实战流程与参数精解。从拍摄合格的棋盘格图像、设置关键参数(如径向畸变系数),到分析重投影误差、优化结果并正确导出和使用内外参,提供了从操作到原理的全面指导,帮助读者为立体视觉应用奠定精准基础。 阅读详情

相关推荐

同物种,不同版本之间的坐标转化

是最常用的工具,如果有可用的链文件,这通常是最便捷的方法。CrossMap是一个功能强大的替代工具,支持多种文件格式和物种。自定义生成链文件适用于没有现成资源的情况,虽然复杂一些,但可以满足特定需求。Ensembl 和 Gramene提供的工具适用于支持的物种,尤其在植物基因组领域可能更具优势。选择合适的方法取决于你正在处理的物种、基因组版本以及现有的资源。

qq_40256654的博客 1853

C++“拷贝构造函数”和“重载 = 运算符”

拷贝构造函数和缺省拷贝构造函数 拷贝构造函数 功能介绍 拷贝构造函数是一种特殊的构造函数,作用是用一个已知的对象来初始化一个新创建的同类的对象。 关键字:①新创建的;②同类的; 定义方法 ClassName::ClassName([const]ClassName & obj) //注意形参是实参的【常】引用 { <函数体> } (如果是类体内进行定义,那么把类名限定去掉即可。) 特点 ①只有一个参数,且形参必须是对实参的引用(实参的别名); ②如果给出关键字 const ,那

Lucky.Mr.Li的博客 3106

倍福 MODBUS TCP/IP通信

(*默认字符串80字节,此处声明为255字节,可以一次性传42个UINT数据.5位整数加一个空格,即每个数据6字节*)(*---------------------------------------- 以下为用户程序 ----------------------------------------*)(*读回并换算后的值*)(*准备写到PLC的值*)(*用于比较两次读回的值相差多少,以估计通讯的速度, Act_CalcDiff*)(*用于切换读和写,Act_Protocal*)

qq_33280096的博客 1367

关于拷贝构造函数和重载成员运算符=

#include #include using namespace std; /********内存重复释放,根本原因就是浅拷贝**********/ //解决方案1:getName使用引用传递参数,这个时候两个对象其实是同一个地址 //解决方案2:自定义拷贝构造函数进行深拷贝 //如果浅拷贝且使用按值传递传递参数,则可能会造成野指针 /* class Person { public:

gukesdo的专栏 2268

从工艺到器件:用Silvaco ATLAS仿真PIN二极管击穿电压的保姆级指南

本文详细介绍了使用Silvaco ATLAS仿真PIN二极管击穿电压的全流程指南,从工艺仿真基础搭建到器件结构构建,再到击穿特性仿真和结果分析。通过Silvaco工具链,工程师可以在设计阶段精准预测器件性能,优化击穿电压,提升研发效率。

weixin_34259816的博客 358

「UG/NX」多功能dll集成一个dll的三种方法

C++多功能集成一个dll的三种方法。

何曾参静谧的博客 1390

c++中,一个没有拷贝构造函数和重载=运算符的string类,

c++中,一个没有拷贝构造函数和重载=运算符的string类,会出现什么问题,如何解决? 如果没有定义拷贝构造函数和重载=运算符,则系统会自动生成逐位拷贝的函数。 当我们用string初始化string时,(比如 string a("abc"); string b = a;),两个对象会指向同样的内存地址。在两个对象的析构函数中,我们会对同一个内存块调用两次删除,导致不确定的结果。 当我

kkk的专栏 1071

【数字IC设计】芯片设计中的RDC

在芯片设计中,RDC是的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错误逻辑的模块,而使其它模块保持正常工作。

qq_40268672的博客 2190

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

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

zhang_si_hang的博客 3378

TPAMI 2024 | 重新思考多焦点图像融合中客观评价指标的有效性:一种基于统计的方法

作为一种延长光学镜头景深(DOF)的有效技术,多焦点图像融合最近成为图像处理社区的一个活跃话题。然而,该领域仍然存在一个未解决的主要问题,即缺乏选择客观评价指标的通用标准。因此,不同研究中使用的指标往往差异显著,导致难以实现公正的评估。为了解决这个问题,本文提出了一种基于统计的方法来验证多焦点图像融合中客观指标的有效性。核心思想是采用统计相关性度量来评估某个融合指标与一些流行的全参考图像质量评估模型之间的性能一致性。

小白学视觉 329

RK3568实现蓝牙音箱功能

A2DP旨在通过蓝牙连接传输高质量的立体声音频流。它使用的基本压缩算法是SBC(Sub-Band Coding)来减小音频数据的大小,同时保持高音质,SBC压缩虽然效率较低,但是是必须支持的基本备用方案。A2DP还支持其他高级编解码器,例如AAC、aptX和LDAC,这些编解码器比SBC提供更好的音质,但这些编解码器的支持取决于设备本身的支持情况。注意A2DP协议要与AVRCP协议区分开。A2DP是传输音频的,而AVRCP是用来控制音频的。这里我用到的是RK3568 Android11。

leikko的博客 1176

【C++】复制构造函数(拷贝构造函数)和=运算符重载使用的区别

C++ primer的习题,被复制构造函数和赋值符的区别弄晕了。简单地说,有一道题目如下描述: class t1; class t2 = t1; 我先看见有一个等号,以为就是赋值符来做的,其实并不是这样的。做一个实验好了: [cpp] view plain copy class CTest   {   public:

xiaomingZeng的博客 1884

Machine Unlearning: A Survey

机器学习已经引起了广泛的关注,并发展成为一种使能技术,用于广泛的高度成功的应用,如智能计算机视觉、语音识别、医疗诊断等。然而,由于隐私、可用性和/或被遗忘权,一些特定样本的信息需要从称为机器遗忘的模型中删除,这就产生了一种特殊的需求。这项新兴技术因其创新性和实用性而引起了学术界和工业界的极大兴趣。与此同时,这个雄心勃勃的问题导致了许多旨在应对其挑战的研究工作。据我们所知,没有任何研究分析过这一复杂的主题,也没有比较过现有的遗忘解决方案在不同场景下的可行性。因此,通过这项调查,我们旨在了解遗忘技术的关键概念。

c_cpp_csharp的专栏 1159

= 运算符重载

类中有指针成员必须重载 “ = ”运算符指针作为类的成员:拷贝构造函数 必须自定义必须重载 = 运算符。

m0_62700819的博客 731

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

拷贝构造函数与赋值运算符重载的区别

拷贝构造函数应用的场合由以下几个方面:   1 函数的参数是一个对象,并且是值传递方式  2 函数的返回值是一个对象,并且是值传递方式  3 用一个对象初始化另外一个对象  由此,当函数的参数或者返回值为一个对象时,使用的时候要小心,因为值传递的时候执行的是位拷贝,并不会调用对象的构造函数,也就是说生成的临时对象可能不是正确初始化的,这样就可能会出现一些意向不到的问题。当返回值是个对象和用一个对象初始化另外一个对象时的情况是相同的。  比如如下代码:   #include   using namespace

ぁ風雲變色ぁ 3478

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++中的赋值运算符重载 与 拷贝/复制构造函数函数

一、调用拷贝构造函数的三种情况 1.用类的一个对象去初始化类的另一个对象时。 2.当函数的形参是类的对象,调用函数进行形参和实参的结合时。 3.当函数的返回值是对象,函数执行完成返回调用者时。 这里就第一种情况展开举例 如下(其中Point为一个类) int main (){ Point a(1,2); Point b(a); //用对象a初始化对象b,复制构造函数被调用 Point c=a; //用对象a初始化对象c,复制构造函数被调用 return 0; } 也就是说P

qq_42069571的博客 1483

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++运算符重载总结

一定要自定义一个拷贝构造函数,这样在重载运算符返回对象副本的时候,编译器会自动调用拷贝构造函数,否则会出现结果错误。把‘=’运算符重载为类成员变量,并且将返回值设计成为该类的引用。除了‘=’运算符以外,其他的运算符重载最好设计成为友元函数。这就是我们今天要讲的运算符重载的总结.友元关系不会被派生类继承。

wo_ai_luo_的博客 1672

详解拷贝构造函数&拷贝赋值运算符

帮你理清拷贝构造和拷贝赋值

随手写下笔记和感悟 1947

C++之=运算符重载

1、类中没有指针成员 如果类中没有指针成员 ,不需要重载=运算,默认的浅拷贝就可以完成幅值。 #include <iostream> using namespace std; class Person { private: int a; int b; public: Person():a(0),b(0) { cout<<"无...

Evan_work的博客 6887

C++编程 友元函数、友元类、运算符重载 案例详细解析

C++编程 友元函数、友元类、运算符重载 案例详细解析

m0_56051805的博客 1502

C++引用 与 运算符重载

c++中,引用其实还是靠指针实现的 为什么要引入引用呢? c++之父说,最初是为了实现运算符重载方便,下面举个例子 例如 c =a +b是可以接受的写法, 而c =&a +&b 就不是很方便而且有歧义了 那么下面说一下,哪些运算符重载必须用引用呢 +=运算符,它本身的意义是「自增,并返回自增后的值」,所以就要返回自己,而不是返回一个自己的拷贝(返回自己的拷贝就成别的值了) 还有= 等等 还有一个,拷贝构造函数参数一定要是引用不然编译通不过,为什么呢? 因为在入参的..

马小超 735

编码实现字符串类CNString实现运算符重载

题目描述: 编码实现字符串类CNString,该类有默认构造函数、类的拷贝函数、类的析构函数及运算符重载,需实现以下“=”运算符、“+”运算、“[]”运算符、“<”运算符及“>”运算符及“==”运算符(备注:可以用strcpy_s, strcat_s,但禁用STL及String类),以下为各个运算符的运算效果的详细说明 “CNString.h” #define _CRT_SECURE_...

weixin_30640769的博客 212

[C++] 拷贝构造函数和浅拷贝问题

1.拷贝构造函数 当使用一个对象来初始化另一个同类对象时,编译器将自动生成一个构造函数,这个构造函数称为拷贝构造函数,其格式如下: CustomClass(const CustomClass &amp;amp;amp;amp; obj); 在之前说过,创建类时,如果没有提供构造函数,那么编译器将会自动提供一个默认的构造函数。 拷贝构造函数也是一样,如果没有提供拷贝构造函数,那么编译器将会提供一个默认的拷贝构造函数。 1...

FightFightFight的博客 677

c++构造函数总结----C++拷贝构造函数及重写operator =的区别

c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助。 c++类的构造函数详解:                         一、 构造函数是干什么的 class Counter { public:         

Wait的专栏 2467

拷贝构造函数 与重载=号运算符

//单纯值复制 #include <iostream> using namespace std; class Computer { friend void test(); //普通构造(无参),以使用重载”=“运算符 Computer() {}; //普通构造,给对象赋值 Computer(int price) : m_price(price) { }; //拷贝构造函数,对象之间赋值(创建对象时) //如果只是赋值,不进行修改实参的数据,加const保护数据 Com

m0_52379411的博客 334

c++ primer c++11 拷贝控制 移动构造 移动赋值 各种运算符重载 实例代码 在也不怕不会用啦 13-14

13 14

summer的博客 349
上一篇: 正则表达式实用性练习一 在匹配中排除字符串
下一篇: 不能忍受了,告诉大家一个拨打腾讯客服电话的好方法
zhsp1029
博客等级 码龄21年 115粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值