我正在學習使用練習考試的C++考試。我在確定何時調用某些構造函數時遇到問題。代碼是 -默認構造函數調用
using namespace std;
#include <iostream>
class Fraction
{
private:
int numerator, denominator;
public:
Fraction(int = 0, int = 1);
friend ostream& operator<<(ostream&, const Fraction&);
};
void debug(Fraction, Fraction);
Fraction task(Fraction&, const Fraction&);
int main()
{
Fraction * A[6], * B; // Line 1
Fraction C(3), D(C); // Line 2
Fraction E[4], F = D; // Line 3
Fraction G, H(3, 4); // Line 4
debug(C, D); // Line 5
B = new Fraction; // Line 6
F = task(H, C);
delete B;
return 0;
}
void debug(Fraction X, Fraction Y)
{
cout << X << endl << Y << endl;
}
Fraction task(Fraction& X, const Fraction& Y)
{
Fraction Z;
Z = Fraction(5, 2); // Line 7
return 1; // Line 8
}
現在,我認爲在3種類型的實例中調用默認的複製構造函數。
實施例1 -
Fraction A(1,2);
Fraction B(A);
實施例2 -
Fraction A(1,2);
Fraction A = B;
3 - 當一個對象被作爲參數傳遞到 - 當一個對象從一個函數
4返回功能
有兩個問題,我似乎無法回答 -
問題1 - 考慮上面的源代碼。當編譯並執行標記爲「第3行」和「第4行」的 語句時,將針對這些語句中的每個 對構造函數調用類「分數」多少次?
答案是 - d)線路3:5個通話線路4:2個來電
的這個問題的答案是D.然而,當我回答這個問題,我得到不同的結果 -
Fraction E[4], F = D; // Line 3
我看到默認的構造函數被調用5次,E [4],但我認爲這這種說法也相當於陣列 -
Fraction E[4], Fraction F(D);
因此,默認構造函數被調用5次,複製構造函數一次。顯然,這是不正確的,因爲構造函數只被調用5次。我沒有看到我的錯誤在哪裏。
我的另一個問題是在以下問題 -
考慮(上頁)圖2中的源代碼。當編譯並執行標記爲「第7行」和「第8行」的 語句時,將針對這些語句中的每個 對構造函數調用類「分數」多少次?
答案是 - d)7號線:1次通話中的線路8:1的呼叫
Fraction task(Fraction& X, const Fraction& Y) { Fraction Z; Z = Fraction(5, 2); // Line 7 return 1; // Line 8 }
我原本以爲默認構造函數將被調用,以創建分數(5,2一個臨時對象)那麼複製構造函數會將Fraction(5,2)複製到Z.這實際上是默認賦值運算符的操作嗎?至於第8行,這是調用複製構造函數,因爲它正在返回一個Fraction類型的對象?
一些問題,而我在這裏 -
會 -
debug(B, C)
調用拷貝構造函數兩次通過分數對象B和C的副本?
是 -
F = task(H, C);
調用默認的賦值運算符,以及爲F已作爲初始化Fraction對象?
爲什麼不在調試器中運行此代碼? – 2013-03-24 02:03:36
對不起,如果這不能回答你的問題。該程序正在使用默認的構造函數。我試圖在默認的構造函數被調用時做筆記。如果有一個調試器會告訴我,那會很好。不過,我想明白爲什麼我會佔用更多的電話而不是分配問題的答案。就像第3行一樣,我只是爲了一個電話而不是答案。關於我的邏輯的東西是錯誤的。 – jonnywalkerr 2013-03-24 02:08:28
你的代碼是否被編譯?至少不在g ++ 4.7.2 – gongzhitaao 2013-03-24 02:10:27