2012-07-04 86 views
0

在下面的代碼中有一個用於將A類對象轉換爲const類B對象的轉換運算符。const轉換運算符的行爲

我的問題是何時const B對象被創建,爲什麼它的值改變爲 b.v = 20沒有提供任何錯誤。

也許我錯過了一些東西。

提前

class B 
{ 
public: 
    int v; 
    B() : v(10) {} 
}; 

class A 
{ 
public: 
    operator B() const {} 
}; 


void g(B b) 
{ 
    b.v=20; 
} 

int main() 
{ 
    A a; 
    g(a); 
    return 0; 
} 
+0

Thanx for edit。我將在下一次處理它 – Luv

回答

3

const後的成員函數簽名無關返回類型爲感謝名單;它僅意味着該功能(或由其返回的值)不會改變原始對象的狀態,即不會更改標記爲mutable的成員以外的成員。

此外,您的功能g()按參數值參數,因此無論如何都會被複制。

1

您函數接受的價值參數,所以它的返回什麼副本,它不是const - 這樣你就可以在體內修改。

void g(B b) 
+0

你的意思是說運算符B()const {}返回的值將被存儲在一個臨時對象中,然後對象b將通過copy-constructor被構造出來。 – Luv

+0

@Luv,沒有臨時中介,由Luv('B'的一個實例)返回的值將被用於將參數構造到函數('b')。你可以測試這個爲你自己,在複製構造函數中插入一些調試語句,例如...(我忽略了編譯器可能做的優化..) – Nim

+0

但它需要存儲在某處傳入拷貝構造函數爲函數b構造參數。 – Luv