1. 程式人生 > >劍指offer面試題1之賦值運算子函式

劍指offer面試題1之賦值運算子函式

//要寫一個賦值運算子函式,即過載賦值運算子,有兩種形式:類成員函式和友元函式;我們這裡用類成員函式的形式
#pragma once

class CMyString
{
public:
	//CMyString(void);//這個建構函式和CMyString(char* pdata = NULL)一定程度上重定義了,當定義
	                  //CMyString型別物件時,若都不傳參,即用CMyString A;不知道呼叫哪一個了;
	                  //但CMyString A(NULL)就可以,但還是有警告多次定義建構函式!但當把=NULL去掉就
	                  //不會重定義了,因為去掉後,該建構函式需要傳參才會被呼叫。
	~CMyString(void);
	//CMyString(char* pdata):m_pdata(pdata){}//這裡宣告和定義一起了(引數初始化列表)
	CMyString(char* pdata = NULL);//這裡是預設m_pdata為NULL,即CMyString A;那A.m_pdata = NULL;
	CMyString(const CMyString& str);//拷貝建構函式,加const是為了不改變引數的狀態
	                                //加&是為了避免呼叫拷貝建構函式時,由形參到實參呼叫拷貝建構函式
	                                //從而變成死迴圈!所以C++標準不允許拷貝建構函式傳值引數
	CMyString& operator =(const CMyString& str);//過載賦值運算子函式,引數為引用,避免從形參到實參呼叫
	                                            //一次拷貝建構函式,這是無謂消耗,避免
	                                            //只有返回一個引用才能連續賦值
public:
	char* m_pdata;

};     

#include "StdAfx.h"
#include "CMyString.h"

//CMyString::CMyString(void)
//{
//}

CMyString::~CMyString(void)
{
}
CMyString::CMyString(const CMyString& str)
{
	this->m_pdata = str.m_pdata;
}
CMyString::CMyString(char* pdata)//這裡不能加=NULL,否則會報重定義的錯誤
{
	this->m_pdata = pdata;
}
//CMyString& CMyString::operator =(const CMyString& str)//初級程式設計師做法,考慮點為:
//{                                              //1,判斷傳入的例項和當前例項是不是同一個例項,若是,直接返回  
//	                                           //2,是否釋放例項自身的記憶體,若忘記,會出現記憶體洩露
//	                                           //3,傳參是否為常量引用,為了高效,避免無謂消耗 
//	                                           //4,返回值是否為該型別的引用,為了可以連續賦值
//	if (this == &str)//若不判斷,那麼在釋放記憶體後,傳入引數也被釋放了,再也找不到賦值內容了。                         
//	{
//		return *this;  
//	}
//	else                                           
//    {
//		delete[] m_pdata;//釋放該例項的空間
//		m_pdata = NULL;//避免野指標
//		m_pdata = new char[strlen(str.m_pdata) + 1];
//		strcpy(m_pdata, str.m_pdata);
//		return *this;
//    }
//	                                         
//}                                              
//為什麼說是初級程式設計師呢?
//因為沒有考慮異常安全性原則,我們在分配記憶體之前就釋放了例項的記憶體,那麼若new char不成功,丟擲異常
//那麼m_pdata將是一個空指標,賦值沒成功不止,還把原來的自己丟了。
//該進!!!!!
//第一種是:讓一個區域性指標指向m_pdata,再new一個空間,若成再釋放這個區域性變數指向的空間
//主要看第二種:
CMyString& CMyString::operator =(const CMyString& str)
{
	if (this != &str)
	{
		CMyString str_temp(str);
		char* ptemp = str_temp.m_pdata;
		str_temp.m_pdata = m_pdata;
		m_pdata = ptemp;//就是把區域性變數m_pdata指向位置和該例項m_pdata指向位置互換
	}
	return *this;
}
//這好在哪呢?
//1,先建立一個臨時例項,若不成功,丟擲異常,不影響原來的自己,保證了異常安全性。
//2,若建立成功,str_temp是區域性變數,作用域在if中,出了if就自動呼叫解構函式,而我們
//把str_temp.m_pdata和原來自己的m_pdata互換了,這時候析構的就是原來自己的空間了。

#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#include "CMyString.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	//CMyString A(NULL);
	char *a = new char[10];
	string temp = "hello!!";
	stringstream ss;
	ss << temp;
	ss >> a;
	CMyString A(a);
	//測試用例1
	CMyString B = A;
	printf("%s\n", B);
	//測試用例2
	CMyString C;
	C = B = A;
	//cout << C.m_pdata;//m_pdata改成public可以
	printf("%s\n", C);
	//測試用例3
	B = B;
	printf("%s", B);
	system("pause");
	return 0;
}
//輸出結果為:hello!!
//            hello!!
//            hello!!請按任意鍵繼續...	   

相關推薦

offer試題1運算子函式

//要寫一個賦值運算子函式,即過載賦值運算子,有兩種形式:類成員函式和友元函式;我們這裡用類成員函式的形式 #pragma once class CMyString { public: //CMy

offer-試題1運算子函式

如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。 解析:給一個類進行運算子過載。 關鍵部分程式碼: CMyString& CMyString::operator =(const CMyString &str) { if(this == &str)

Offer試題1運算子函式

給類CMyString新增賦值運算子函式,初級做法如下: #include<iostream> #include<string.h> using namespace std; class CMyString{ public: CMyStrin

offer:試題1運算符函數

void 面試題1 賦值運算 入參 vat strcpy 參數 urn char* 題目 如下為類型CMyString的聲明,請為該類型添加賦值運算符函數 class CMyString { public: CMyString(char* pData

Offer試題1運算子函式

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

offer試題1-10

#1二維陣列中的查詢 在一個二維陣列中,每一行元素都按照從這裡寫程式碼片左到右遞增的順序排序,每一列元素都按照從上到下遞增的順序排序。實現一個查詢功能的函式,函式的輸入為二維陣列和一個整數,判斷陣列中是否含有該整數。 //例如查詢元素7 //二位陣列的規律是從

C++字串過載運算子函式offer試題1

//劍指offer面試題1:過載運算子函式 //題目:如下為型別CMyString的宣告,請為該型別新增多種運算子函式。 #include<iostream> #include<cstring> #include<cstdio>

offer{試題32:求從1到n的整數中1出現的次數}

思路:map.get獲得出現次數 import java.util.HashMap; public class Solution { public int FirstNotRepeatingChar(String str) { int len = str.length(); if(len =

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

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

Offer:試題32——從1到n整數中1出現的次數(java實現)

問題描述: 輸入一個整數n,求1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字有1,10,11,12,1一共出現了5次。 思路:(不考慮時間效率的

offer試題(一):運算子函式

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

Offer試題:11.列印1到最大的n位數

一、題目:列印1到最大的n位數 題目:輸入數字n,按順序打印出從1最大的n位十進位制數。比如輸入3,則打印出1、2、3一直到最大的3位數即999。 二、不同的解法 2.1 不假思索的解法   最容易想到的辦法是先求出最大的n位數,然後用一個迴圈從1開始逐個列印: static v

Offer試題:9.二進位制中1的個數

一、題目:二進位制中1的個數 題目:請實現一個函式,輸入一個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。 二、可能引起死迴圈的解法   一個基本的思路:先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時

Offer試題1.實現Singleton模式

說來慚愧,自己在畢業之前就該好好看看《劍指Offer》這本書的,但是各種原因就是沒看,也因此錯過了很多機會,後悔莫及。但是後悔是沒用的,現在趁還有餘力,把這本書好好看一遍,並通過C#通通實現一遍,並記錄在我的部落格中,作為學習筆記。 一、題目:實現Singleton模式 題目:設計一個類,我們只能

Offer試題:12.在O(1)時間刪除連結串列結點

一、題目:在O(1)時間刪除連結串列結點 題目:給定單向連結串列的頭指標和一個結點指標,定義一個函式在O(1)時間刪除該結點。   原文采用的是C/C++,這裡採用C#,節點定義如下: public class Node<T> { // 資料域

offer試題把陣列排成最小的數

1,問題:輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 2,想法:

offer-試題32.從1到n整數中1出現的次數

題目:輸入一個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字中1,10,11和12,1一共出現了5次 本題可以直接變數1到n的n個數然後

Offer——試題31:整數中1出現的次數

整數中1出現的次數(從1到n整數中1出現的次數) 題目:求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer

offer試題[32]:從1到n整數中1出現的次數

題目描述        求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後

Offer試題61:按子型列印二叉樹 Java實現

/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0