1. 程式人生 > >劍指Offer:面試題01---賦值運算子函式

劍指Offer:面試題01---賦值運算子函式

題目: 如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。

class CMyString
{
public:
     CMyString(char *pData=NULL);
     CMyString(const CMyString& str);
     ~CMyString(void);
private:
     char *m_pData;
};
本題考點:
1. 考查對C++的基礎語法的理解,如運算子函式、常量引用等;
2. 考查對記憶體洩漏的理解;
3. 對高階C++程式設計師,面試官還將考查應聘者對程式碼異常安全性的理解。


測試用例:
1. 把一個CMyString的例項賦值給另外一個例項;
2.把一個CMyString的例項賦值給自身;
3.連續賦值。
// AssignmentOperator.cpp : Defines the entry point for the console application.
//

// 《劍指Offer——名企面試官精講典型程式設計題》程式碼
// 著作權所有者:何海濤

#include <iostream>
#include <string>
using namespace std;

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] = '\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:\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 main()
{
    Test1();
    Test2();
    Test3();

    return 0;
}



相關推薦

Offer試題01---運算子函式

題目: 如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。 class CMyString { public: CMyString(char *pData=NULL); CMyString(const CMyString& str

offer試題2

面試題2:實現Singleton模式 編譯器:python3.5.2 程式設計環境:pycharm2018.1.2x64 方法一、__new__方法來實現單例模式 用__new__方法實現的單例模式,比如下面的MyClass類,會對類的初始化有影響嗎?會對類的例項方法

offer試題4

面試題4:如果直接每次遇到空格新增’%20’,那麼空格後面的數字就需要頻繁向後移動。遇到這種移動問題,我們可以嘗試先給出最終需要的長度,然後從後向前掃描,同時給定兩個指標來保證定位。逆向思維 編譯器:python3.5.2 程式設計環境:pycharm2018.1.2x6

offer試題16

面試題16:反轉連結串列:需要注意三個問題:1、輸入的連結串列頭指標為None;2、整個連結串列只有一個結點時 ;3、反轉後的連結串列出現斷裂,返回的翻轉之後的頭節點不是原始連結串列的尾結點。因此需要引入一個翻轉後的頭結點,以及一個指向當前結點的指標,一個指向當前結點前一個結

offer試題57

面試題57:刪除連結串列中重複的結點:我們需要設定一個指標preNode,preNode最開始為None,然後設定兩個指標,pNode指向當前節點,pNext指向pNode下一個結點: 如果pNext不為空而且pNext的值等於pNode的值,那麼就說明出現了重複數字的結點

offer試題單例模式的實現(使用C++語言)

#include <iostream> #include <iomanip> #include <cstdio> #include <cstdlib>

Offer試題1運算子函式

// 面試題1:賦值運算子函式 // 題目:如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。 class CMyString {        public:               CMyString(char* pData = nullptr);             

offer試題10斐波那契數列

題目一:求斐波那契數列的第n項 寫一個函式,輸入n,求斐波那契(Fibonacci)數列的第n項。斐波那契數列的定義如下: 當n=0時,f(n)=0; 當n=1時,f(n)=1; 當n>1時,f(n)=f(n-1)+f(n-2); 從下往上計算,首先根據 f(0)和 f(

offer試題32從上到下列印二叉樹

題目一:不分行從上到下列印二叉樹 從上到下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印。 二叉樹節點的定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNo

offer試題9用兩個棧實現佇列

題目:用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式appendTail 和deleteHead ,分別完成在佇列尾部插入節點和在佇列頭部刪除節點的功能。 template <typename T> class CQueue { public: CQueue(vo

offer試題8二叉樹的下一個節點

題目:給定一顆二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中的節點除了有兩個分別指向左、右子節點的指標,還有一個指向父節點的指標。 二叉樹的節點定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode*

offer試題7重建二叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 二叉樹節點的定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; Binar

Java《Offer試題2替換空格

替換空格 題目描述:請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。 思路:建立StringBuffer物件,然後將StringBuffer物件轉成字串物件,接著呼叫字串物件的replace方法,將空格

Offer試題找出陣列中有3個出現一次的數字

題目 一個int陣列中有三個數字a、b、c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。 思路 由於3個數字出現一次,其他數字均出現兩次,因此可以得到n一定為奇數。 3個只出現一次的數字,他們的bit位肯定不可能全部相同,也就是說

offer試題2實現 Singleton 模式

本文目錄: 懶漢式和餓漢式 解法1:只適用於單執行緒環境 (不好) 解法2:雖然在多執行緒環境中能工作,但是效率不高 (不好) 解法3:加同步鎖前後兩次判斷例項是否存在  (可行) 解法4:利用類靜態變數初始化一個例項  (推薦使用) 解法5:靜態內部類實

Offer系列-試題39-2判斷一棵樹是否為平衡二叉樹

題目:判斷一棵樹是否為平衡二叉樹 思路:根據上一題的二叉樹的深度,在遞迴過程中加上識別符號,遞迴到當前節點,判斷當前子樹是不是一個平衡二叉樹,如果不是,就把識別符號置為false,返回識別符號即可。

offer試題14剪繩子

題目:給你一根長度為 n 繩子,請把繩子剪成m段(m、n都是整數,n>1並且m≥1)。每段的繩子的長度記為k[0]、k[1]、…… 、k[m]。請問 k[0] * k[1] * … * k[m]可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得

offer試題57(1)和為S的數字

題目 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,是的他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 ps: 對應每個測試案例,輸出兩個數,小的先輸出。 思路

Offer試題8旋轉陣列的最小數字

一:題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大

offer試題21調整陣列順序使奇數位於偶數前面

題目1:輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。 如果不考慮時間複雜度,最簡單的思路應該是從頭掃描這個陣列,每碰到一個偶數時,拿出這個數字,並把位於這個數字後面的所有的數字往前面挪動一位。挪完之後在陣列的末