2012-05-25 50 views
7

Mã của tôi:Constructor không đặt biến thành viên

#include <iostream> 
using namespace std; 

class Foo 
{ 
public: 
    int bar; 

    Foo() 
    { 
     bar = 1; 
     cout << "Foo() called" << endl; 
    } 

    Foo(int b) 
    { 
     bar = 0; 
     Foo(); 
     bar += b; 
     cout << "Foo(int) called" << endl; 
    } 
}; 

int main() 
{ 
    Foo foo(5); 
    cout << "foo.bar is " << foo.bar << endl; 
} 

Sản lượng:

Foo() called 
Foo(int) called 
foo.bar is 5 

Tại sao không phải là giá trị foo.bar 6? Foo() được gọi nhưng không được đặt bar thành 1. Tại sao?

+4

'Foo(); 'tạo ra một đối tượng tạm thời chưa được đặt tên và ngay lập tức phá hủy nó. Điều gì mà bạn _expected_ xảy ra? – ildjarn

Trả lời

12

Trong hàm tạo sau, dòng có Foo() không ủy nhiệm cho hàm tạo trước đó. Thay vào đó, nó tạo ra một đối tượng tạm thời mới của loại Foo, không liên quan đến *this.

Foo(int b) 
{ 
    bar = 0; 
    Foo(); // NOTE: new temporary instead of delegation 
    bar += b; 
    cout << "Foo(int) called" << endl; 
} 

đoàn Constructor hoạt động như sau:

Foo(int b) 
    : Foo() 
{ 
    bar += b; 
    cout << "Foo(int) called" << endl; 
} 

Tuy nhiên, điều này chỉ có thể với C++ 11.

+0

+1 để ghi chú "chỉ có thể với C++ 11" -> http://meta.stackexchange.com/q/133642/186397. – Drise

2

Bởi vì bạn có dòng này trong constructor:

bar = 0; 

Bạn đang cố gắng gọi các nhà xây dựng khác với Foo() cuộc gọi trong constructor thứ hai, nhưng nó chỉ tạo ra một temp Foo dụ.

3

bạn không thể sử dụng hàm tạo như hàm bình thường. trong mã của bạn gọi Foo() tạo một đối tượng mới trong ngăn xếp.

Các vấn đề liên quan