面試題1:如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。
class cmystring ;
介紹過載賦值
【主要困惑的是,為什麼定義函式的時候使用了&,下面重點講解這個】
cmystring
&
operator=(const cmystring& str);
過載操作符是一些函式,其名字為關鍵字operator後緊跟需要過載的運算子,比如"operator="表示需要過載"="。像任何其他函式一樣,操作符函式有乙個返回值和乙個形參表。形參表必須具有與該操作符運算元數目相同的形參,但是如果操作符是乙個成員函式,它的第乙個運算元隱式繫結到this指標,因此形參表中的引數會減少乙個。因為賦值運算子必須是類的成員函式,所以this繫結到左運算元的指標。因此,賦值操作符只接受乙個形參,且該形參是同一型別的物件,右運算元一般作為const引用傳遞,跟拷貝建構函式相同。
賦值操作符的返回型別應該與內建型別賦值運算的返回型別相同,內建型別的賦值運算返回對左運算元的引用,因此賦值操作符也返回對同一類型別的引用。賦值必須返回對*this的引用,也就是左運算元的引用。
一般而言,賦值操作符與復合賦值操作符應返回左運算元的引用。
其中:this是指向本類的指標,*this就是this所指向的物件,即當前物件;另外補充一點,(*this).data與this->data是等價的。
從上述基礎知識我們知道了過載賦值操作符是乙個類的成員函式,這個函式的返回型別是左運算元的引用,也就是*this,並且這個函式的引數是乙個同型別的常引用變數。通過上述知識我們可以確定過載操作符函式為:
cmystring& operator=(const cmystring& str);//過載運算子
完整的**實現如下:
第一種解法:
#include "stdafx.h"
#include#includeusing namespace std;
void cmystring::print()
//建構函式
cmystring::cmystring(char *pdata)
else //如果建構函式的引數不為null,那麼首先求出字串長度,然後new乙個長度為len+1的字元陣列 }
//析構函式
cmystring::~cmystring()
//拷貝建構函式,拷貝建構函式與建構函式的思路非常類似。
cmystring::cmystring(const cmystring& str)
//過載運算子
cmystring& cmystring::operator=(const cmystring& str)
char* strs = "hello";
cmystring str1(strs);//呼叫了建構函式
cmystring str2;
cmystring str3(str1);//呼叫了拷貝建構函式
cmystring str4=str1;//呼叫了拷貝建構函式
str2 = str1;//呼叫了賦值運算子函式
str1.print();
str2.print();
str3.print();
str4.print();
system("pause");
第二種解法
cmystring& cmystring::operator=(const cmystring& str)
return *this;
}
注意:在編寫**的過程中,遇到了這種錯誤: 錯誤
2 error c4430: 缺少型別說明符 - 假定為 int。注意: c++ 不支援預設 int
d:\program files\microsoft visual studio\vc\include\sal.h
2381
1 1_cmystringop
錯誤1 error c2144: 語法錯誤:「int」的前面應有「;」
d:\program files\microsoft visual studio\vc\include\sal.h
2381
1 1_cmystringop
原因:在檔案頭部多寫了乙個中文格式的':
賦值運算子函式
賦值運算子函式的 需要關注幾點 1 是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 只有返回乙個引用,才可以允許連續賦值。否則如果函式的返回值void,該賦值運算子將不能做連續賦值。2 是否把傳入的引數的型別宣告為常量引用。引數宣告為引用可以避免無謂的消耗,提高...
賦值運算子函式
題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 1 經典解法,初級程式設計師 cmystring cmystring operator const cmystring str 2 考慮異常安全的解法,高階程式設計師 cmystring cmys...
賦值運算子函式
型別宣告如下 class cmystring 請為上型別新增賦值運算子函式.經典解法 cmystring cmystring operator const cmystring str 考慮異常安全性解法 cmystring cmystring operator const cmystring str...