2011-08-09 261 views
0

就是其中任一在代碼中使用的區別,因爲我已經使用here(第44行廣告線45都工作得不錯)默認複製建築工和默認的賦值操作符

摘錄:

Date temp = *this; //ASSIGNMENT OPERATOR CALL(PROVIDED BY COMPILER) 
//Date temp(*this); //COPY CONSTRUCTOR CALL(PROVIDED BY COMPILER) 

我的意見:是否在賦值期間像object1 = object2; object2的內容被刪除並放置在object1中,而如果通過拷貝構造函數發生同樣的事情,object2的內容仍然保留(我的意思就像單詞建議「複製」一樣)。

注:順便說一下我的代碼編譯的罰款在Microsoft Visual C++ 2008,但它在ideone.com.Any原因是什麼給了一個警告

prog.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Date&)’: 
    prog.cpp:103: warning: deprecated conversion from string constant to 

+0

警告是不言而喻的 - 你試圖存儲'爲const char *'的'字符*'(其中孔陣列 - 但你現在應該是字符串文字是const的理解) – Nim

+0

謝謝,我現在明白了但MV C++沒有給出任何警告,編譯器幫助我的那個 – munish

+1

operator =從來不會在你的摘錄中被調用。 – pmr

回答

4
Date temp = *this; 
Date temp(*this); 

都調用拷貝構造函數,
首先被稱爲拷貝初始化 &第二被稱爲直接初始化

簡單的規則要記住這是:
如果一個對象正在創建以及在同一語句中初始化,然後它調用複製構造函數。

如果一個對象剛被分配,而不是在同一個語句中創建,那麼它調用Assignment(Copy Assignment)操作符。


編譯器抱怨因爲:

一個普通字符串文字具有類型爲「n常量字符的數組」。對於字符串文字(4.2),從const到非const限定的隱式轉換已被棄用。

參考文獻:
C++標準段[2.13.4/2]:
一個普通的字符串文字的類型爲array of n const char,其中n是如下面所定義的字符串的大小;它具有靜態存儲持續時間(3.7),並使用給定字符進行初始化。

附錄d部[D.4/1]
const從到non-const資格string literals(4.2)的隱式轉換的棄用。

因此,爲了避免該警告你應該使用:

static const char *monthName[13] 
     ^^^^^^^ 
+0

所以L「你好」不是MS擴展,但C++標準? –

+0

1:'之間的數據X = Y甲鮮爲人知差;以及'數據X(Y)';'(兩者確實調用構造和未賦值運算符):如果構造被標記後者也適用'明確',前者不。 –

+0

@Ali Veli:L「你好」是Unicode字符串的Windows版本。 OP正在談論** String Literals **,請在谷歌上查找大膽的詞語,我相信它會更有意義,如果您不明白,請在此處提問。 –

1
static char *monthName[13] 

可以/應該是

static const char *monthName[13] 

以避免該警告。

1

默認的拷貝構造函數和默認的賦值運算符之間的區別是,當賦值運算符被調用時,接收對象的成員已經初始化值,而你只是在該值的副本替換它們第二個對象。通過複製構造函數,成員被初始化爲第二個對象中成員的副本。第二個對象應該完全不受任何操作的影響。

但是,你不使用你的代碼中的賦值運算符,您使用的是拷貝構造函數。如果你這樣做了:

Date temp; 
temp = *this; 

然後你會使用賦值運算符。

+0

我明白了@Benjamin – munish