zoukankan      html  css  js  c++  java
  • P25、面试题1:赋值运算符函数

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

    class CMyString

    {

    public:

        CMyString(char* pData = NULL);

        CMyString(const CMyString& str);

    ~CMyString(void);

    private:

        char* m_pData;

    };

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

    1)是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(即*this)。只有返回一个引用,才可以允许连续赋值。否则如果函数的返回值是void,应用该赋值运算符将不能做连续赋值。假设有3CMyString的对象:str1str2str3,在程序中语句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[1];
    
            m_pData[0] = '';
    
        }
    
        else
    
        {
    
            int length = strlen(pData);
    
            m_pData = new char[length + 1];
    
            strcpy(m_pData, pData);
    
        }
    
    }
    
     
    
    CMyString::CMyString(const CMyString &str)
    
    {
    
        int length = strlen(str.m_pData);
    
        m_pData = new char[length + 1];
    
        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) + 1];
    
        strcpy(m_pData, str.m_pData);
    
        return *this;
    
    }
    
     
    
    // ====================测试代码====================
    
    void CMyString::Print()
    
    {
    
        printf("%s", m_pData);
    
    }
    
     
    
    void Test1()
    
    {
    
        printf("Test1 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
    
        CMyString str2;
    
        str2 = str1;
    
     
    
        printf("The expected result is: %s.
    ", text);
    
     
    
        printf("The actual result is: ");
    
        str2.Print();
    
        printf(".
    ");
    
    }
    
     
    
    // 赋值给自己
    
    void Test2()
    
    {
    
        printf("Test2 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
    
        str1 = str1;
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
    
        str1.Print();
    
        printf(".
    ");
    
    }
    
     
    
    // 连续赋值
    
    void Test3()
    
    {
    
        printf("Test3 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
    
        CMyString str2, str3;
    
        str3 = str2 = str1;
    
     
    
        printf("The expected result is: %s.
    ", text);
    
     
    
        printf("The actual result is: ");
    
        str2.Print();
    
        printf(".
    ");
    
     
    
        printf("The expected result is: %s.
    ", text);
    
     
    
        printf("The actual result is: ");
    
        str3.Print();
    
        printf(".
    ");
    
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    
    {
    
        Test1();
    
        Test2();
    
        Test3();
    
        return 0;
    
    }
  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4907379.html
Copyright © 2011-2022 走看看