1. 程式人生 > >劍指offer面試題(一):賦值運算子函式

劍指offer面試題(一):賦值運算子函式

對於定義一個賦值運算子函式時,需要注意一下幾點:

(1)函式的返回型別必須是一個引用,因為只有返回引用,才可以連續賦值

(2)傳入的引數宣告為常量引用,可以提高程式碼效率,同時賦值運算函式內不會改變傳入的例項狀態

(3)一定要記得釋放例項自身已有的記憶體,否則程式容易出現記憶體洩露

(4)注意傳入的引數和當前的例項是不是同一個例項,如果是同一個,則不用進行賦值操作,直接返回即可。

程式碼示例如下:

#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()
{
	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()
{
	cout<<m_pData<<endl;
}

void test1()//普通賦值
{
	cout<<"test1() begins:"<<endl;
	char *text = "hello world";
	CMyString str1(text);
	CMyString str2;
	str2 = str1;

	cout<<"The expected result is: "<<text<<endl;
	cout<<"the actual result is: "<<endl;
	str2.Print();

	cout<<endl;
}


void test2()//自身賦值
{
	cout<<"test2() begins:"<<endl;
	char *text = "hello world";
	CMyString str1(text);
	str1 = str1; 

	cout<<"The expected result is: "<<text<<endl;
	cout<<"the actual result is: "<<endl;
	str1.Print();

	cout<<endl;
}

void test3()//連續賦值
{
	cout<<"test3() begins: "<<endl;
	char *text = "hello world";
	CMyString str1(text);
	CMyString str2,str3;
	str3 = str2 = str1;

	cout<<"The expected result is: "<<text<<endl;
	cout<<"the actual result is: "<<endl;
	str2.Print();
	cout<<endl;

	cout<<"The expected result is: "<<text<<endl;
	cout<<"the actual result is: "<<endl;
	str3.Print();
	cout<<endl;
}


int main()
{
	test1();
	test2();
	test3();

	return 0;
}


總結:運算子函式、常量引用的使用。

何時使用賦值操作符:

(1)將已有的物件賦給另一個物件時,將使用過載的賦值操作符;

初始化時並不一定使用賦值操作符,一般使用複製建構函式。但是使用複製建構函式建立一個臨時物件,然後通過賦值將臨時物件的值複製到新物件中。

賦值操作符的功能:

賦值操作符的隱式實現也對成員進行逐個複製。如果成員本身是類物件,則程式將使用為這個類定義的賦值操作符來複制該成員,但靜態資料成員不受影響。

相關推薦

offer試題運算子函式

對於定義一個賦值運算子函式時,需要注意一下幾點: (1)函式的返回型別必須是一個引用,因為只有返回引用,才可以連續賦值 (2)傳入的引數宣告為常量引用,可以提高程式碼效率,同時賦值運算函式內不會改變傳入的例項狀態 (3)一定要記得釋放例項自身已有的記憶體,否則程式容易出現記

offer試題2——實現Singleton模式

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

offer演算法題二維陣列中的查詢

劍指offer演算法題(一) 題目1:二維陣列中的查詢 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 思路分析:  從左上往右下方來解決這個問題  例如在

leetcode 70. 爬樓梯【遞迴】【Easy】&& Offer試題10 題目2青蛙跳臺階問題

題目: 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個正整數。 示例 1: 輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1. 1

leetcode 287. 尋找重複數【Medium】【陣列】 && Offer 試題3 題目2不修改陣列找出重複的數字

       這道題leetcode和劍指Offer題目略有不同。leetcode說陣列中的重複數可能不止一個,但是結果要求返回一個就行;劍指Offer上說只有一個重複的數,但是重複的次數不一定。兩個題目的共性就是隻需要返回一個重複的數即可。 leetco

leetcode 70. 爬樓梯【遞迴】【Easy】&& Offer試題10 題目2青蛙跳臺階問題

題目: 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個正整數。 示例 1: 輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1. 1 階 + 1 階 2.

試題Java基礎知識

Java 基礎知識01. 面向物件的特性有哪些?答:封裝、繼承和多型。02. Java 中覆蓋和過載是什麼意思?解析:覆蓋和過載是比較重要的基礎知識點,並且容易混淆,所以面試中常見。答:覆蓋(Overr

Offer試題40Java版陣列出現次的數字

題目:一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。 * 請些程式找出這兩個只出現一次的數字。要求時間複雜度為O(n),空間複雜度為O(1) 例如輸入陣列{2,4,3,6,3,2,5,5},

Offer試題25Java版二叉樹中和為某的路徑

題目:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉結點所經過的所有的結點形成一條路徑。 如下圖,輸入二叉樹和整數22,則打印出兩條路徑,第一條路徑包含結點10,12,第二條路徑包含的結點為10,5,7. 一般的資料結構

Offer試題35java版第一個只出現次的字元

題目:在字串中找出第一個只出現一次的字元。如輸入"abaccdeff",則輸出'b'. 看到這樣的題目,我們最直觀的想法就是從頭開始掃描這個字串中的字元。當訪問某個字元時拿這個字元和後面的每個字元相比

Offer試題15Java版鏈表中倒數第K個結點

head 計數器 easy sta 相同 ret white style 輸出 題目: 輸入一個鏈表。輸出該鏈表中倒數第k哥結點。 為了符合大多數人的習慣,本題從1開始計數。即鏈表的尾結點是倒數第1個結點。 比如一個鏈表有6個結點。從頭結點開始它們的值依次是1。2。

Offer試題43Java版n個骰子的點數

pac pos max mod ins pri class pro bili 題目:把n個骰子仍在地上。全部骰子朝上一面的點數之和為s,輸入n,打印出s的全部可能的值出現的概率。 解法一:基於遞歸求骰子的點數,時間效率不夠高 如今我們考慮怎樣統計每個點數出現的次數。要向

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

 題目描述: 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 思路一:有點死腦筋,每次pop後都預設下次是push操作,,,,。233主要是由於沒把握好兩個棧模擬時入隊和出隊的時機。考慮stack1和stack2的大小和入隊出隊的關係即可改

offer試題陣列中重複的數字 google 面試

目錄 參考部落格: 題目一:找出陣列中重複的數字 思路一 思路二 題目二:不修改陣列找出重複的數字 測試: 牛客:  牛客高贊(和思路二類似都是hash對映,網友思路真是腦洞大開,這裡相關溢位問題考慮的只有~(1<<31)>>1,

offer試題7:重建二叉樹java實現

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果都不含重複的數字。例如:輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}則重建二叉樹:其中二叉樹的定義如下:  * publi

offer試題13:機器人的運動範圍java

題目:地上有一個m行n列的方格。一個機器人從座標(0,0)的格子開始移動,他每次可以向上,下,左,右移動一格。但不能進入行座標和列座標的數位之和大於k的格子。例如,當K=18時,機器人能夠進入方格(35,37),因為3+5+3+7 =18,但是它不能進入方格(35,38),

offer試題30:包含min函式的棧Java實現

題目:定義棧的資料結構,請在該型別中實現一個能夠得到棧的最小元素的min函式,在該棧中,呼叫min,push,及pop的時間複雜度都為O(1)。 直接上程式碼: import java.util.Stack; public class Solution {

Offer試題10Java版二進位制中的1的個數

題目:請實現一個函式,輸入一個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1,因此如果輸入9,該函式輸出2. 1、可能引起死迴圈的解法 這是一道很基本的考察二進位制

Offer試題39Java版二叉樹的深度

題目:輸入一棵二叉樹的根節點,求該數的深度。從根節點到葉結點依次進過的結點(含根,葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 例如,如下圖的二叉樹的深度為4,因為它從根節點到葉結點的最長的路徑包含4個結點(從根結點1開始,經過2和結點5,最終到達葉結點7) 我們

Offer試題36Java版陣列中的逆序對

題目:在陣列中的兩個數字如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數 例如在陣列{7,5,6,4}中,一共存在5對逆序對,分別是{7,6},{7,5},{7,4},{6,4},{5,4}。 看到這個題目,我們的第一反