2013-04-09 28 views
-1

這裏是基本上實現對類名爲CMyString =賦值的代碼,代碼是正確的。關於運算符的C++訪問

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; 
} 

該實例通過引用傳遞,第一個'if'檢查傳入的實例是否爲自身。我的問題是:爲什麼它使用&str來比較,而不是str已經包含實例的地址?任何人都可以解釋這條線的工作原理嗎?

此外,我只是想確保this包含對象的地址:這是正確的嗎?

+0

的建議,中序進行賦值運算execption SAFTY其更好地存儲臨時指針中的m_pData在末尾刪除臨時指針,以便即使在爲m_pData = new分配內存時發生異常char [strlen(str.m_pData)+ 1];源對象的數據是安全CMyString&CMyString ::運算符=(const的CMyString&STR){ 如果(這==&STR) 返回*此; char * temp = m_pData; m_pData =新的char [strlen的(str.m_pData)+ 1]; strcpy(m_pData,str.m_pData); delete [] temp; temp = NULL; return * this; } – shivakumar 2013-04-09 06:11:31

+0

我知道,我還想着把類似的功能,但沒有異常處理,但是這不是真的什麼,我就在這裏...但我還是謝謝你 – fiftyplus 2013-04-09 06:14:49

回答

1

Address-of OperatorReference Operator是不同的。

&除了作爲地址運算符之外,還用於C++中作爲參考聲明。意義不一樣。

int target; 
int &rTarg = target; // rTarg is a reference to an integer. 
         // The reference is initialized to refer to target. 
void f(int*& p);  // p is a reference to a pointer 

如果你拿一個引用的地址,它會返回它的目標地址。使用之前的聲明,& rTarg是與&目標相同的內存地址。

4

尚未str的包含實例

號的參考文獻是對象本身的地址。它不是一個指向對象的指針。 。

(一,即在函數的聲明,&str代表「參考str」和「的str地址」 - 如果函數被宣佈像你說什麼是正確的這樣的:

CMyString& CMyString::operator =(const CMyString *str); 

但它不是)

+0

一個跟進的問題: – fiftyplus 2013-04-09 06:43:11

+0

剛剛發現有一個關於差異由C和C++,在C之間引用傳遞,參考通過使用&一個過去了,一相同類型的指針將被用於訪問存儲在該指針的值。但似乎在C++中,不需要使用&a,它可以使用a,參數必須是引用類型。在我的情況是(CMyString&str)。所以當一個str對象被傳入時,這個引用類型究竟意味着什麼?與原來的一樣嗎?看起來像這個引用類型對象的用法看起來非常類似於一個值類型對象。 THANKs – fiftyplus 2013-04-09 07:17:49

+2

@fifty C沒有引用。 C有指針。當您使用富(一)C,你傳遞一個指針,和Foo的簽名是FOO(type_of_a *)。在C++中,你可以做同樣的事情,加上通過引用。 foo的簽名變爲foo(type_of_a&),並將其用作foo(a)。這裏不是一個指針,它是一個參考。正如H2CO3所說的那樣,一個參考是物體本身。您可以像使用該對象一樣使用此引用。看到傑梅因徐對操作員的回答,這可能會解釋你的困惑。 – undu 2013-04-09 08:01:27

0

strstr傳遞給賦值運算符是通過引用,所以它包含了實際的對象,而不是它的地址。 A this是指向正在調用方法的類的指針,因此如果想要比較,傳遞的對象是否是同一個對象本身,則必須獲取str的地址才能進行比較。

請注意,&的行爲有所不同,具體取決於它的使用位置。如果在聲明中,它意味着獲取它應用於的對象的地址。另一方面,如果它用於聲明中,則表示聲明的對象是參考

請看下面的例子:

int i = 42; 
int & refToI = i; // A reference to i 
refToI = 99; 
std::cout << i; // Will print 99 

int j = 42; 
int * pJ = &j; // A pointer to j 
*pJ = 99; 
std::cout << j; // Will print 99 

this是一個指向實例,所以是的,它包含了地址。

驗證的整點,如果傳遞的對象是this或不是爲了避免不必要的(或可能是破壞性的)賦值給自己。

0

確實是一個變量引用 - 在類型名稱後面用符號&表示 - 底層實現通常是一個指針,C++標準看起來並沒有指定它。

在它的使用,無論如何,在語法級別,參考使用一樣的相同類型的非參考值,即。更嚴格地說:

如果變量的類型是T &,那麼它應該像使用T那樣來使用。

如果你必須寫str.someMethod()而不是str->someMethod()(不箭頭操作符的任何重載),則必須使用&獲得值的地址。換句話說,引用或多或少地像變量的別名,而不像指針。

有關引用和指針的更多信息,請參見以下問題: