【剑指Offer】面试题1:赋值运算符函数

嵌入式开发利器:Processor Expert驱动套件10.4深度解析与实践指南 在嵌入式系统开发中,硬件驱动开发是连接应用逻辑与物理硬件的关键桥梁,其效率与可靠性直接影响项目成败。传统的手动配置寄存器方式虽然可控,但效率低下且易错;而标准外设库则在灵活性与代码体积上存在局限。为此,自动化代码生成与驱动管理工具应运而生,其核心原理是通过图形化配置实现硬件抽象,自动生成高度优化的底层C代码,从而将开发者从繁琐的寄存器操作中解放出来,专注于系统架构与业务逻辑。这类工具在提升开发效率、保证代码质量及增强可维护性方面具有显著技术价值,尤其适用于汽车电子、工业控制等对可靠性和开发周期要求严苛的应用 阅读详情

《剑指Offer——名企面试官精讲典型编程题》

作者:何海涛


一、书上原题再现

面试题1:赋值运算符函数

题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。

class CMyString

{

public:

    CMyString(char* pData = nullptr);

    CMyString(const CMyString& str);

    ~CMyString(void);

 

    void Print();

     

private:

    char* m_pData;

};


二、涉及的知识点


三、解题过程

赋值:

       int a;  //声明

       a = 10; //赋值

      

运算符:

       + - * / = % < > ?: 等等

      

赋值运算符:

       =

      

赋值运算符函数:

       What?嗯?https://i-blog.csdnimg.cn/blog_migrate/e79375d47caa8e45cf6dbcec06add236.jpeg

 

其实,这里涉及到了运算符重载的知识点。我一个遨游在Java大海里的浪子,突然灌一口C/C++的海水,感觉有点生涩。https://i-blog.csdnimg.cn/blog_migrate/bf8dac4caa0581f97befa41007dfe3ac.png

 

什么是运算符重载?

简单讲,比如说:

       + 加号的本意是   1+1 = 2  在这里是 累加 的功能

       在类似于Java、Python这类高级语言中,当 + 加号 出现在字符串之间比如 "Hello" + "World !",那么这里的加号就会被用来实现 连接两个字符串 的功能。

       加号不干 累加 的功能,而是实现了 连接两个字符串 的功能,这就叫做 加法运算符的重载。

       运算符重载中有一点要求需要特别注意:重载运算符的参数至少应有一个是类对象(或类对象的引用)

  也就是说,参数不能全部是C++的基本类型,以防止用户修改用于基本类型数据成员的运算符的性质,如下面这样是不对的:

                     int operator + (int a,int b)

                     {

                            return(a-b);

                     }

  原来运算符+的作用是对两个数相加,现在企图通过重载使它的作用改为两个数相减。

  如果允许这样重载的话,那么表达式4+3,它的结果是7还是1呢?显然,这是绝对要禁止的。

             

Java八大基本数据类型:

              byte   short        int          long

              float   double     boolean         char

      

       基本数据类型是没有String的,String的本质是一个用户类。所以说当加号出现在两个字符串之间的时候,实现连接两个字符串这个功能是加法运算符的重载。

       但是,但是,但是,Java语言没有运算符重载:

              Java doesn’t support user-defined operator overloading.

                Java不支持用户自定义操作符重载。

              The preferred approach is to define a method on your class to perform the action: a.add(b) instead of a + b.

                首选的方法是在类中定义一个方法来实现这个功能,比如说通过 a.add(b) 来实现 a+b 的功能。

              The only aspect of Java which comes close to “custom” operator overloading is the handling of + for strings,

                Java唯一接近“自定义”运算符重载的方面是 + 用于字符串的处理,

              which either results in compile-time concatenation of constants or execution-time concatenation using StringBuilder/StringBuffer.

                这里的加法会造成在编译期或执行期使用StringBuilder/StringBuffer。

             

       那么回到正题,这道题用的语言是C++,C++是有运算符重载的,给一个类添加赋值运算符函数。这个类就是一个字符串类,名为:CMyString

赋值运算符函数,就是重载赋值运算符了。下面是该函数的声明:

       CMyString& operator = (const CMyString& str);

       CMyString& 是函数的类型   operator = 整体看成函数名 const CMyString&是参数的类型 str 是参数的引用名

       我们要做的就是书写函数体。

初级程序员版:

1     CMyString& operator = (const CMyString& str){

2            if(this == &str){

3                   return *this;

4            }else{

5                   delete []m_pData;

6                   m_pData = NULL;

7                   m_pData = new char[strlen(str.m_pData)+];

8                   strcpy(m_pData, str.m_pData);

9                   return *this;

10          }

11   }

       这一版本的Bug之处就在于,假如第5、6行代码执行完成之后,第7行代码在分配内存的时候,分配失败了,那么我原先的数据也就没有了。

这样原先的对象就会成为一个空指针,想象一下,一个空指针在程序中,一旦程序后文又用到这个对象,那么这个程序极有可能崩溃!!!

考虑到异常安全性,下面的代码是

高级程序员版:

1     CMyString& operator = (const CMyString& str){

2            if(this == &str){

3                   return *this;

4            }else{

5                   CMyString strTemp(str);

6                   char* pTemp = strTemp.m_pData;

7                   strTemp.m_pData = m_pData;

8                   m_pData = pTemp;

9                   return *this;

10          }

11   }     

 


四、调试步骤

使用DevC++进行调试

 


五、总结

不理解的地方:

                 CMyString strTemp(str);  看不懂这句代码,这句代码怎么就创建一个临时对象了,

这难道不是 类型名   函数名  参数?如果是这样的话,那么这个函数连声明都没有直接就用了?

       既然临时对象一但运行结束就会被析构,那么为什么要进行交换?直接把临时对象的值赋值给当前对象的值不就行了?

       一行代码

              m_pData = strTemp.m_pData

       不比三行代码强吗?

  如果是说不能这样直接进行赋值,需要有个 char* pTemp的中间变量,那也应该是

  两行代码:

              char* pTemp = strTemp.m_pData;

//            strTemp.m_pData = m_pData;

              m_pData = pTemp;

  中间那行代码的意义何在,难不成是写交换算法写顺手了???

             

  百思不得其姐......(所以我现在还不是高级程序员......)             

             

总结:

  1、 C++中通过运算符函数(关键字operator)可以对运算符进行重载;

  2、如果要为一个类写赋值运算符函数,需要考虑内存分配失败的异常情况下要原对象不能为空指针的情况;

  3、 一个对象的值,可以在创建的时候通过构造函数进行赋值,

    也可以把另一个对象的值通过赋值运算符赋值给当前对象,

    也可以通过赋值运算符进行多个对象的连续赋值,

    这,就是赋值运算符函数的意义;

  4、C++很飘逸,很成功,很失败,临时对象很难懂;

  5、这道题的精髓我认为是就两点:

    一是如何把这个operator = 函数完整的写出来,

    二是在写的过程需要考虑内存泄漏的情况。


六、声明与致谢

本题源代码请移步《剑指Offer》作者何海涛的GitHub:https://github.com/zhedahht/CodingInterviewChinese2/blob/master/01_AssignmentOperator/AssignmentOperator.cpp

      

参考文章:(每篇文章我都会去点赞https://i-blog.csdnimg.cn/blog_migrate/194e0757497c3aa2d41b59f750dbd29c.png,好的文章就应该公诸于世,大家共同学习)

  博客园:

    颜之年《C++重载运算符的规则详解》:https://www.cnblogs.com/summernight/p/8541079.html

    同勉共进《一文说尽C++赋值运算符重载函数(operator=)》:https://www.cnblogs.com/zpcdbky/p/5027481.html#top

    默默淡然《运算符重载详解》:https://www.cnblogs.com/liangxiaofeng/p/4311796.html

  RUNOOB:

    Java基本数据类型:http://www.runoob.com/java/java-basic-datatypes.html

  优快云:

    michellechouu《【C++】赋值运算符函数》:https://blog.youkuaiyun.com/michellechouu/article/details/47298445

    liaotl10《才知道java竟然没有运算符重载》:https://blog.youkuaiyun.com/liaotl10/article/details/74999757

    Do丶YouMissing《java中是否对“+”,“=”,“+=”重载》:https://blog.youkuaiyun.com/caonima0001112/article/details/50492718

    viclee108《浅析Python运算符重载》:https://blog.youkuaiyun.com/goodlixueyong/article/details/52589979

  技术小黑屋:https://droidyue.com/

 

面试题1:赋值运算符函数 剑指OFFER 第一道题目的C++代码, 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。可以说是非常详细了。 立即下载

相关推荐

别再死记硬背了!一张图搞懂无刷电机半桥与全桥驱动的核心差异(附避坑指南)

本文深入解析无刷直流电机的半桥与全桥驱动方式的核心差异,提供直观对比与选型指南。半桥驱动结构简单、成本低,适合低要求场景;全桥驱动性能优越但复杂,适用于高精度控制。文章还包含实战避坑指南,帮助工程师优化驱动方案选择与应用。

weixin_29290947的博客 320

《剑指Offer》思考总结——第一题:赋值运算符函数

从今日开始,将第二版《剑指Offer》书中的题再做一遍,总结一下做题思路。主要是自我总结备份一下做题过程,也欢迎有兴趣的朋友提出意见或对错误进行指正。 第一题 赋值运算符函数 所需知识基础:拷贝构造,构造析构,重载操作符 题目: 这道题是面试时经常让手写的代码之一。主要考察的知识点正如书中所说: 1.是否把返回值类型声明为该类型的引用,并在函数结束前返回实例自身的引用...

qq_38635138的博客 404

从零构建:四轴机械臂D-H参数建模与MATLAB实战指南

本文详细介绍了四轴机械臂D-H参数建模的完整流程与MATLAB实战应用。从机械臂运动学基础出发,解析D-H参数原理与坐标系建立规则,提供MATLAB Robotics Toolbox的安装、模型创建及正逆运动学求解的代码实现。特别针对四轴机械臂的逆运算优化、轨迹规划和奇异位形规避等高级应用给出实用解决方案,是机器人开发者的实战指南。

weixin_29062255的博客 420

[剑指-Offer] 1. 赋值运算符函数(编程语言、细节处理、代码优化)

文章目录1. 题目来源2. 题目说明3. 题目解析3.1 C++六大默认成员函数3.2 C++运算符重载及==5点注意==3.3 C++赋值运算符及==5点注意==3.4 初级程序员写法3.5 考虑异常安全性的解法,高级程序员必备 1. 题目来源 《剑指-Offer》第二版,P25,面试题1:赋值运算符函数 2. 题目说明 如下为类型CMyString的声明,请为该类型添加赋值运算符函数: cla...

Y-puyu 的博客 472

Cadence16.6安装教程

如需安装所需的软件,请到文章末尾处查看 安装步骤: 安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文。 试装系统:win10 64bit 1.解压安装包(共5个压缩包,每个都要解压) 2.以管理员身份运行安装程序。 3.选择License Manager。 4.点击NEXT。 5.选择I accept,然后点击NEXT。 6.选择License Manage...

谢谢关注“小鱼教你模数电”,各平台同号 8万+

基于51单片机的贪吃蛇游戏设计

本科时候做的一个课程作业,自己打一个很简易的电路,比较有意思且易上手,故将之记录下来。(全套的仿真及代码,演示视频,课程报告以及PPT展示上传在优快云下载区) 一. 实验目的 (1) 通过对C51语言的理解,编写程序实现对贪吃蛇的有效控制; (2) 通过对51单片机硬件的学习,学会运用面包板,独立按键、点阵屏等,完成对完整电路的搭建过程; (3) 通过对Proteus仿真软件的学习,实现基于STC89C52单片机的8*8点阵贪吃蛇的硬件电路仿真。 二. 实验介绍 贪吃蛇是一款经典小游戏,其游戏的规则是:玩

山山の十三先生 2万+

【剑指offer】面试题1:赋值运算符函数

题目要求为下面一个类实现一个赋值运算符的函数:class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(); private: char* m_pData; }; 我们要实现任意

Preke的专栏 639

Xilinx-复旦微-FPGA-眼图BlockDesign系统制作-针对PCIE系统

XIlinx-复旦微电子-FPGA-眼图BlockDesign系统制作-针对PCIE系统,手把手教你如何建立眼图测试

weixin_43444334的博客 2598

剑指offer1:赋值运算符函数

#include<iostream> using namespace std; class CMyString{ public: CMyString(char* pData=NULL) { m_pData=pData; } CMyString(const CMyString& str) { m_pData=str.m_pData

小羊哈利 578

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 651

华为 MetaERP 财务模块的核心业务对象,按子模块与架构维度分类,以表格呈现,适配架构设计与实施落地

华为MetaERP财务模块基于4A架构(业务/应用/数据/技术)与TOGAF框架,实现业财一体化与全球合规。业务架构涵盖组织模型与核心流程,应用架构支撑财务操作,数据架构确保数据一致性,技术架构提供高性能技术底座。模块覆盖总账、应收应付、资产等子模块,支持多组织、多币种、多准则核算,通过实时会计引擎实现"交易即核算"。4A架构与TOGAF框架对应,实现业务能力、应用组件、数据模型与技术栈的深度融合,为华为全球化财务核算提供核心支撑。

金牌架构师 440

剑指offer第2版——面试题1:赋值运算符函数

异常安全性原则(Exception Safety Guarantees)是 C++ 中处理异常的重要设计准则,它定义了函数在发生异常时应保证的程序状态,确保即使出现异常(如内存分配失败、操作无效等),程序也不会出现资源泄漏、数据损坏或对象处于无效状态等问题。基本保证(Basic Guarantee):核心要求:当异常发生后,程序能保持有效状态(所有对象的不变式仍成立,资源未泄漏),但对象的具体状态可能不可预测(不一定是异常发生前的状态)。示例。

qq_42615475的博客 1032

计算机控制技术及应用

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

《剑指offer 第2版》面试题1:赋值运算符函数

赋值运算符函数”指C++中重载赋值运算符(operator=)的函数。在定义类中,尤其是当类中有指针成员变量或资源需要手动管理时(如内存、文件句柄等)。1、浅拷贝赋值:只复制指针地址,data=other.data;2、深拷贝赋值:创建新对象,复制值,data = new int(*other.data);

qq_60874090的博客 1424

精雕软件(JDpaint) 5.5 绿色版

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

剑指offer面试题1:赋值运算符函数

赋值运算符函数 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数 class CMyString { public: CMyString(char * pData=nullptr); CMyString(const CMyString &str); private: char * m_pData; } 要点: 定义赋值构造函数的要点: 要将函数返回值类型...

陈乐乐的博客 309

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

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

剑指offer 面试题1:赋值运算符函数【C++版本】

题目总结与代码归档: 【剑指offer-2】题目目录【C++版本】 GitHub代码路径: GitHub 面试题1 赋值运算符函数 题目: 如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public: //构造函数 CMyString(char *pData = nullptr); //拷贝构造函数 CMyS...

墨1024 275

剑指offer 面试题1:赋值运算符函数

题目描述: 如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 题目分析: 定义一个赋值运算符函数,应注意以下几点: 1)返回值的类型应为该实力自身的引用(即*this)。返回引用,才可以连续赋值。 2)传入的参数类型声明为const常量引用。理由有两点:一是在赋值运算符函数内不会改变传入的实例;二是如果传入的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数,

海阔天空sky的博客 814

《剑指Offer》面试题1:赋值运算符函数

题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; } 1. strcpy的处理学习 ...

童年的纸飞机的博客 248

《剑指offer》面试题1:赋值运算符函数 思考总结

《剑指offer》面试题1:赋值运算符函数 思考总结

Mi-ronin的博客 681

【剑指offer】面试题1:赋值运算符函数【C++版本】

总结的部分题目思路与代码,待完善。 【剑指offer-第二版】部分题目与解答【C++版本】 题目: 赋值运算符函数 如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public: //构造函数 CMyString(char *pData = nullptr); CMyString(const CM...

m0_37950361的博客 1824

java赋值运算符题目_《剑指Offer》面试题1:赋值运算符函数

《剑指Offer——名企面试官精讲典型编程题》作者:何海涛一、书上原题再现面试题1:赋值运算符函数题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public:CMyString(char* pData = nullptr);CMyString(const CMyString& str);~CMyString(void);void P...

weixin_31884143的博客 554

[剑指offer]面试题1:赋值运算符函数

面试题1:赋值运算符函数 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public: CMyString(char *pData = nullptr); CMyString(const CMyString &str); ~CMyString(void); private: char *m_pDate; }; 经典解法,适用初级程序员: CMyString & CMyString::operator=(const C

m0_51955470的博客 273

【整理】剑指offer——C++ 面试题1:赋值运算符函数

1. 四个与类型转换相关的关键字?各有什么特点?分别在哪些场合使用? static_cast、dynamic_cast、const_cast、reinterpret_cast static_cast 特点:静态转换,编译时期的静态类型检测。 应用场合:主要用于C++中内置的基本数据类型之间的转换,但是没有运行时类型的检测来保证转换的安全性。 #include <iostream> ...

修的博客 299

剑指Offer之面试题1:赋值运算符函数

所有代码均通过G++编译器测试,仅为练手纪录。 //面试题1:赋值运算符函数 //题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public:     CMyString(char* pData = NULL);     CMyString(const CMyString& str);     ~CMySt

Pillary的专栏 468
上一篇: 【JavaEE】Eclipse必知必会
下一篇: 【剑指Offer】面试题2:实现Singleton(单例)模式
midnight_time
博客等级 码龄10年 1714粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值