2015-02-08 31 views
0

我想知道這個代碼是如何正確的,以及編譯器如何知道如何首先創建一個類A的obj,我認爲它不應該編譯,因爲B的ctor請求類型A的參數不是詮釋C++的朋友類作爲參數爲ctor

class A 
{ 
    int a1; 
public: 
    A(int i) { cout << i << "A"<<endl;} 
    friend class B; 
}; 

class B 
{ 
public: 
    B(A a) {cout <<"B" <<a.a1;} 
}; 

void main() 
{ 
    B b(7); 
} 

輸出:7A B7

+3

將顯式添加到A(int)構造函數以防止此行爲。 – hynner 2015-02-08 09:55:47

回答

6

這與friend無關。

因爲您還沒有標記A構造函數explicit,因此會發生從intA的隱式轉換。

1

據我所知,編譯器調用構造函數隱式(因爲A(INT)),所以你的代碼就相當於:

2

編譯器足夠聰明,認爲有一個int ....需要和A - 在這裏等待是構造函數。使用

+1

_「朋友位不是必需的」_它實際上是:'B(A a){cout <<「B」<< a.a1;}' – 2015-02-08 09:56:17

+1

我的錯 - 週日早上。忘記默認爲私人 – 2015-02-08 09:57:40