2013-11-09 15 views
7

C++ 11 bây giờ hỗ trợ thiết lập các giá trị của một trường thành viên lớp tại thời điểm kê khai, như thế này:C++ 11 có khởi tạo lại các trường thành viên được khởi tạo không?

class MyClass 
{ 
private 
    int test = 0; 
} 

Nếu tôi cũng khởi tạo biến trong các nhà xây dựng như thế này:

class MyClass 
{ 
private 
    int test = 0; 

public: 
    MyClass() : test(1) 
    { 
    } 
} 

sẽ điều này làm cho biến có giá trị của nó được đặt hai lần, hoặc đặc tả quy định rằng trình biên dịch nên tối ưu hóa điều này để khởi tạo biến chỉ một lần? Nếu đặc tả không đưa ra bất cứ điều gì, bạn có biết hành vi của các trình biên dịch nổi tiếng (ví dụ: MSVC, GCC, v.v.) đối với điều này không?

Trả lời

14

Các Chuẩn.Hãy có một quy tắc cho điều này, trong §12.6.2/9:

Nếu một thành viên dữ liệu tĩnh không được có cả một cú đúp-hoặc-bằng-initializer và một mem-initializer , khởi tạo được chỉ định bởi bộ khởi tạo mem được thực hiện, và bộ khởi tạo dấu ngoặc đơn hoặc bằng nhau của thành phần dữ liệu không tĩnh bị bỏ qua. [Ví dụ: Với

struct A { 
int i = /∗ some integer expression with side effects ∗/ ; 
A(int arg) : i(arg) { } 
// ... 
}; 

A (int) constructor chỉ đơn giản là sẽ khởi tạo i với giá trị của arg, và các tác dụng phụ trong cú đúp-hoặc-equal- initializer tôi sẽ không diễn ra. - Cuối dụ]

Vì vậy, trong trường hợp bạn mô tả, nếu các nhà xây dựng mặc định được gọi, chỉ việc khởi tạo được xác định sẽ được thực hiện, và test sẽ 1.

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