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

class CMyString

{

public:

CMyString(char* pData = NULL);

CMyString(const CMyString& str);

~CMyString(void);

private:

char* m_pData;

};

在Java中,除了String类的”+”和”=”,不支持赋值运算符重载功能。所以这题只用在C++中。如果要一定一个赋值运算符函数,主要考察以下几点:

1)是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(即*this)。只有返回一个引用,才可以允许连续赋值。否则如果函数的返回值是void,应用该赋值运算符将不能做连续赋值。假设有3个CMyString的对象:str1、str2、str3,在程序中语句str1=str2=str3将不能通过编译。

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

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

4)是否判断传入的参数和当前的实例(*this)是不是同一个实例。如果是同一个,则不进行赋值操作,直接返回。如果事先不判断就进行赋值,那么在释放实例自身的内存的时候就会导致严重的问题:当*this和传入的参数是同一个实例时,那么一旦释放了自身的内存,传入的参数的内存也同时被释放了,因此再也找不到需要赋值的内容了。

代码实现:

// AssignmentOperator.cpp : Defines the entry point for the console application.

//

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

// 著作权所有者:何海涛

#include "stdafx.h"

#include <string>

class CMyString

{

public:

    CMyString(char* pData = NULL);

    CMyString(const CMyString& str);

    ~CMyString(void);

    CMyString& operator = (const CMyString& str);

    void Print();

private:

    char* m_pData;

};

CMyString::CMyString(char *pData)

{

    if(pData == NULL)

    {

        m_pData = new char[];

        m_pData[] = '\0';

    }

    else

    {

        int length = strlen(pData);

        m_pData = new char[length + ];

        strcpy(m_pData, pData);

    }

}

CMyString::CMyString(const CMyString &str)

{

    int length = strlen(str.m_pData);

    m_pData = new char[length + ];

    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;

}

// ====================测试代码====================

void CMyString::Print()

{

    printf("%s", m_pData);

}

void Test1()

{

    printf("Test1 begins:\n");

    char* text = "Hello world";

    CMyString str1(text);

    CMyString str2;

    str2 = str1;

    printf("The expected result is: %s.\n", text);

    printf("The actual result is: ");

    str2.Print();

    printf(".\n");

}

// 赋值给自己

void Test2()

{

    printf("Test2 begins:\n");

    char* text = "Hello world";

    CMyString str1(text);

    str1 = str1;

    printf("The expected result is: %s.\n", text);

    printf("The actual result is: ");

    str1.Print();

    printf(".\n");

}

// 连续赋值

void Test3()

{

    printf("Test3 begins:\n");

    char* text = "Hello world";

    CMyString str1(text);

    CMyString str2, str3;

    str3 = str2 = str1;

    printf("The expected result is: %s.\n", text);

    printf("The actual result is: ");

    str2.Print();

    printf(".\n");

    printf("The expected result is: %s.\n", text);

    printf("The actual result is: ");

    str3.Print();

    printf(".\n");

}

int _tmain(int argc, _TCHAR* argv[])

{

    Test1();

    Test2();

    Test3();

    return ;

}

P25、面试题1:赋值运算符函数的更多相关文章

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

    题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数 class CMyString { public: CMyString(char *pData=NULL); CMyString ...

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

    如下为类型CMyString的声明,请为该类型添加赋值运算符函数. 解析:给一个类进行运算符重载. 关键部分代码: CMyString& CMyString::operator =(const ...

  3. (剑指Offer)面试题1:赋值运算符函数

    题目: 如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{public:    CMyString(char* pData=NULL);    CMy ...

  4. 《剑指offer》面试题1:为类CMyString添加赋值运算符函数——C++拷贝构造函数与赋值函数

    题中已给出CMyString的类定义,要求写赋值运算符函数. #include<iostream> #include<cstring> using namespace std; ...

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

    题目:如下类型为CMyString的声明,请为该类型添加赋值运算符函数.   class CMyString { public: CMyString(char* pData = NULL); CMyS ...

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

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

  7. 剑指offer:赋值运算符函数和复制构造函数

    赋值运算符函数 对于定义一个赋值运算符函数时,需要注意一下几点: (1)函数的返回类型必须是一个引用,因为只有返回引用,才可以连续赋值 (2)传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函 ...

  8. 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果

    package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...

  9. C++赋值运算符函数

    为类添加赋值运算符函数: 类型定义 class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString ...

随机推荐

  1. 使用IO流创建文件并写入数据

    /* 字符流和字节流: 字节流两个基类: InputStream OutputStream 字符流两个基类: Reader Writer 既然IO流是用于操作数据的, 那么数据的最常见体现形式是:文件 ...

  2. 【rest】 深入理解rest

    起因是想搞明白 ajax.rest风格和http请求数据会有什么区别 再来回顾一下概念: REST即表述性 状态 传递 满足这些约束条件和原则的应用程序或设计就是RESTful.需要注意的是,REST ...

  3. LintCode-Median II

    Numbers keep coming, return the median of numbers at every time a new number added. Example For numb ...

  4. cocos2d-x入门笔记(1)

    cocos2d-x的大致开发流程是,首先使用win32版进行代码编写并完成游戏,然后将代码迁移到对应的开发环境上进行交叉编译完成游戏打包,如iphone上是mac+xcode,android是ecli ...

  5. Source Insight中文操作支持的宏

    以下是Source Insight中文字符串支持的宏的实现,在此做个备份. 代码来自网上,非笔者所写.原有代码有个明显的Bug(Del的时候会导致多删除一个字符和多插入一个空格),已经被笔者fix掉. ...

  6. 机器学习中的数学-线性判别分析(LDA), 主成分分析(PCA)

    转:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html 版权声明: 本文由L ...

  7. 'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法

    前言: 本文的解决方法来自http://www.cnblogs.com/xionghui/archive/2012/04/11/2442404.html --感谢! 问题描述:新电脑装mysql后在c ...

  8. HDU 4101 Ali and Baba

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4101 一看之下以为是博弈,后来分析才知道只是搜索题. 首先,我们需要从值为-1的位置由内向外搜索一次, ...

  9. 指针强转和void*

    C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的 ...

  10. eclipse 开发技巧

    1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...