2016-09-17 100 views
2

我嘗試下面的程序:爲什麼在通過值傳遞給函數並將值傳遞給另一個構造函數時,構造函數的調用有什麼區別?

#include <iostream> 
using namespace std; 
class Type{ 
    int i; 
    public: 
    Type() {cout << "type constructor "<<endl;} 
    Type (const Type &) { cout << "type copy constructor called" << endl;} 
}; 

class MyClass { 
    Type variable; 
public: 
    MyClass(Type a) { 
    cout << "inside MyClass constructor "<<endl; 
    variable = a; 
    } 
}; 
void fun (Type){ 
    return; 
} 

int main(){ 
    Type t; 
    cout <<"t created"<<endl; 
    MyClass tmp = MyClass(t); 
    cout<<"calling fun"<<endl; 
    fun(t); 
} 

的這個輸出是:

type constructor 
t created 
type copy constructor called 
type constructor 
inside MyClass constructor 
calling fun 
type copy constructor called 

我很奇怪,爲什麼默認的構造函數被調用時,我把它傳遞給MyClass構造以及爲什麼拷貝構造函數被調用當我通過它fun()
順便說一句,當我使用初始化列表。

回答

2

我很奇怪,爲什麼當我把它傳遞給MyClass的構造

它無關,與這裏路過參數的默認構造函數被調用。作爲成員變量,variable將首先默認構建。

class MyClass { 
    Type variable; 
public: 
    MyClass(Type a) { // variable will be default constructed at first, since it's not initialized via member initializer list 
    cout << "inside MyClass constructor "<<endl; 
    variable = a;  // then variable is assgined via assignment operator 
    } 
}; 

您可以指定variable將通過成員初始化程序列表中初始化,就像

class MyClass { 
    Type variable; 
public: 
    MyClass(Type a) : variable(a) { // variable will be direct initialized via copy constructor 
    cout << "inside MyClass constructor "<<endl; 
    // variable = a;     // no need for assignment 
    } 
}; 

默認構造函數將不會被調用這種情況。

+1

[迂迴]'變量'不是從'a'複製初始化,它是直接初始化的。 – Barry

0

對參數(MyClass構造函數和fun的參數)以及您發佈的日誌報告這兩個參數都會調用複製構造函數。
事實上,你有下面這行兩次:

稱爲

默認的構造函數被調用的數據成員variable類型的拷貝構造函數,因爲它是不明確的初始化。
同樣的情況,如果您使用的初始化列表如下:

MyClass(Type a): variable{} { 
    //... 
} 

其實,如果你沒有任何初始化列表variable被默認初始化,所以沒有理由期待一個不同的日誌。

相關問題