劍指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