题目:

如下为类型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、注意浅拷贝和深拷贝

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

代码:

#include <iostream>
#include <string.h> using namespace std; class CMyString{
public:
CMyString(const char* pData=NULL);
CMyString(const CMyString& str);
CMyString& operator=(const CMyString& str);
char* getData(){return this->m_pdata;};
~CMyString(void); private:
char *m_pdata;
}; /*
// shallow copy
CMyString::CMyString(char* pData){
m_pdata=pData;
} CMyString::CMyString(const CMyString& str){
*this=str;
}
*/ // deep copy
CMyString::CMyString(const char* str){
if(str==NULL){
m_pdata=new char[];
m_pdata[]='\0';
}
else{
m_pdata=new char[strlen(str)+];
strcpy(m_pdata,str);
}
} CMyString::CMyString(const CMyString &str){
m_pdata=new char[strlen(str.m_pdata)+];
strcpy(m_pdata,str.m_pdata);
} CMyString::~CMyString(){
delete[] m_pdata;
} CMyString& CMyString::operator=(const CMyString &str){
if(this==&str)
return *this;
delete []m_pdata;
m_pdata=NULL;
m_pdata=new char[strlen(str.m_pdata)+];
strcpy(m_pdata,str.m_pdata);
return *this;
} int main()
{
char a[]="hello";
CMyString str(a);
CMyString str1(str);
CMyString str2;
CMyString str3;
str3=str2=str;
cout << str.getData()<< endl;
cout << str1.getData()<< endl;
cout << str2.getData()<< endl;
cout << str3.getData()<< endl;
return ;
}

运行结果:

(剑指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. 20162318 2018-2019-2《网络对抗技术》Exp0 Kali安装 Week1

    1.配置虚拟机 参考博客链接 2.安装kali与配置网络 参考博客链接 3.配置共享文件夹 参考博客链接 4.更换软件源 参考博客链接

  2. hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5316 题意:给你n个点,m个操作,每次操作有3个整数t,a,b,t表示操作类型,当t=1时讲a点的值改 ...

  3. Makefile-fPIC,C++静态库与动态库

    在计算机领域中,地址无关代码 (英文: position-independent code,缩写为PIC),又称地址无关可执行文件 (英文: position-independent executab ...

  4. opencv第一课 打开一个图片

    #include<stdio.h>#include<stdlib.h>#include<opencv2\opencv.hpp>#include<iostrea ...

  5. POJ Anniversary party 树形DP

    /* 树形dp: 给一颗树,要求一组节点,节点之间没有父子关系,并且使得所有的节点的权值和最大 对于每一个节点,我们有两种状态 dp[i][0]表示不选择节点i,以节点i为根的子树所能形成的节点集所能 ...

  6. 关于php一些问题

    为什么说php是弱语言? 本身不严格区分变量的类型. 为什么说php是动态语言? 程序在运行时可以改变其结构.所谓的动态类型语言,意思就是类型的检查是在运行时做的. 为什么说php是脚本语言? 不需要 ...

  7. SpringBoot读取配置properties配置文件

    见:http://www.cnblogs.com/VergiLyn/p/6286507.html

  8. C++使用autoreconf -vi出现error: possibly undefined macro: AC_LIBTOOL_WIN32_DLL If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation.

    安装这个:libtool  libsysfs yum install -y libtool libsysfs 参考: https://blog.csdn.net/yusiguyuan/article/ ...

  9. 在Win7环境下安装启动Linux

    在Win7环境下安装启动Linux 在Win7系统下,安装启动Linux特别的不方便,由于XP下的boot.ini配置文件不在了,要加入�一下启动选项的话, 仅仅能使用专门的工具,这或多或少给人带来不 ...

  10. andriod arcgis createPolygons创建带空的面

    private void createPolygons() { // create input polygon 1 PointCollection pointsPoly = new PointColl ...