题目:

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

class CMyString{
public:
    CMyString(char* pData=NULL);
    CMyString(const CMyString& str);
    CMyString& operator=(const CMyString& str);
    ~CMyString(void);

private:
    char *m_pdata;
};

思路:

赋值运算符函数,注意四点:

1、是否将返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用,即*this。只有返回一个引用,才可以允许连续赋值。

2、是否把传入参数的类型声明为常量引用。如果传入的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数,把参数声明为引用可以避免这样的无谓消耗,能提高代码的效率。同时,在赋值运算符函数中不会改变传入的实例的状态,因此应该为传入的引用参数加上const关键字。

3、是否释放实例自身已有的内存,如果忘记在分配新内存之前释放自身已有的空间,程序将出现内存泄露。

4、是否判断传入的参数和当前实例*this是不是同一个实例。如果是同一个,则不进行赋值操作,直接返回。

5、注意浅拷贝和深拷贝

更多考虑:异常安全性等。

代码:

  1. #include <iostream>
  2. #include <string.h>
  3.  
  4. using namespace std;
  5.  
  6. class CMyString{
  7. public:
  8. CMyString(const char* pData=NULL);
  9. CMyString(const CMyString& str);
  10. CMyString& operator=(const CMyString& str);
  11. char* getData(){return this->m_pdata;};
  12. ~CMyString(void);
  13.  
  14. private:
  15. char *m_pdata;
  16. };
  17.  
  18. /*
  19. // shallow copy
  20. CMyString::CMyString(char* pData){
  21. m_pdata=pData;
  22. }
  23.  
  24. CMyString::CMyString(const CMyString& str){
  25. *this=str;
  26. }
  27. */
  28.  
  29. // deep copy
  30. CMyString::CMyString(const char* str){
  31. if(str==NULL){
  32. m_pdata=new char[];
  33. m_pdata[]='\0';
  34. }
  35. else{
  36. m_pdata=new char[strlen(str)+];
  37. strcpy(m_pdata,str);
  38. }
  39. }
  40.  
  41. CMyString::CMyString(const CMyString &str){
  42. m_pdata=new char[strlen(str.m_pdata)+];
  43. strcpy(m_pdata,str.m_pdata);
  44. }
  45.  
  46. CMyString::~CMyString(){
  47. delete[] m_pdata;
  48. }
  49.  
  50. CMyString& CMyString::operator=(const CMyString &str){
  51. if(this==&str)
  52. return *this;
  53. delete []m_pdata;
  54. m_pdata=NULL;
  55. m_pdata=new char[strlen(str.m_pdata)+];
  56. strcpy(m_pdata,str.m_pdata);
  57. return *this;
  58. }
  59.  
  60. int main()
  61. {
  62. char a[]="hello";
  63. CMyString str(a);
  64. CMyString str1(str);
  65. CMyString str2;
  66. CMyString str3;
  67. str3=str2=str;
  68. cout << str.getData()<< endl;
  69. cout << str1.getData()<< endl;
  70. cout << str2.getData()<< endl;
  71. cout << str3.getData()<< endl;
  72. return ;
  73. }

运行结果:

(剑指Offer)面试题1:赋值运算符函数的更多相关文章

  1. 剑指offer第二版-1.赋值运算符函数

    面试题1:赋值运算符函数题目要求:为自定义类添加赋值运算符函数,考察一些细节点的书写.

  2. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  3. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  4. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  5. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历

    二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...

  6. 【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

    题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2 ...

  7. 【剑指Offer面试题】九度OJ1384:二维数组中的查找

    下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> ...

  8. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  9. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  10. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

随机推荐

  1. CF912D Fishes 期望 + 贪心

    有趣的水题 由期望的线性性质,全局期望 = 每个格子的期望之和 由于权值一样,我们优先选概率大的点就好了 用一些数据结构来维护就好了 复杂度$O(k \log n)$ #include <set ...

  2. C# 微信小程序获取openid sessionkey

    项目介绍 1.微信小程序获取openid和session_key 2.后台使用C#开发 项目流程 准备工作 1 获取appid 1.1 下载微信web开发工具 https://developers.w ...

  3. BZOJ2716 KD-Tree

    好久没写博客了 回去赶了好久文化课 颓欲见长 突然翻到fc爷的KD-Tree板子 来切了到裸题 对于一开始的数据我们可以先预处理 具体的排序方式见板子 其实就是我们对每次选定的一块选一个维度来排序啦 ...

  4. php在linux后台执行

    <?php ignore_user_abort();//后台运行 ini_set('default_socket_timeout', -1);//socket不超时 set_time_limit ...

  5. spring---aop(8)---Spring AOP中optimize

    写在前面 optimize是ProxyConfig的属性.意思为 是否对生产代理策略使用优化. public class ProxyConfig implements Serializable { p ...

  6. mybatis_mybatis写mapper文件注意事项

    xml中某些特殊符号作为内容信息时需要做转义,否则会对文件的合法性和使用造成影响 < < > > & & &apos; ' " " ...

  7. 解决firefox不支持innerText的办法

    js代码: <script> window.onload = function(){ if(window.navigator.userAgent.toLowerCase().indexOf ...

  8. hdu1238 Substrings (暴力)

    http://acm.hdu.edu.cn/showproblem.php?pid=1238 Substrings Time Limit : 2000/1000ms (Java/Other)   Me ...

  9. arcgis runtime 100 Create geometries

    1 /* Copyright 2016 EsriEsri 2 * 3 * Licensed under the Apache License, Version 2.0 (the "Licen ...

  10. pytest文档28-重复执行用例(pytest-repeat)

    前言 平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来. 自动化运行用例时候,也会出现偶然的bug,可以针对单个用例, ...