2011-11-19 36 views

Trả lời

8

Có.

Bạn có thể muốn thoát khỏi sự phụ thuộc trật tự khởi tạo, và viết:

C(int _var): var(_var), i(_var*_var) 

Về cơ bản, bằng cách làm cho tôi phụ thuộc vào var, bạn phải đảm bảo var được khai báo trước khi tôi trong lớp.

Tương tự, bạn có thể khởi tạo một cái gì đó trong C được định nghĩa (và khởi tạo) trong một lớp học phụ huynh, vì phụ huynh sẽ được xây dựng trước khi C.

pháp tốt nhất là bạn phải nhận thức được những điều trên, và tránh các tình huống làm xáo trộn bất kỳ điều gì - có thể là sự phụ thuộc của tài liệu vào var, do đó, lập trình viên tiếp theo (có thể là chính bạn) không đưa ra một vấn đề thứ tự khởi tạo.

+1

Tôi muốn nhấn mạnh câu thứ hai của bạn: 'var' phải được khai báo trước' i' trong lớp _definition_. Không có trong danh sách khởi tạo (không quan trọng). –

5

Mã đó đã xác định ý nghĩa, giả sử phép nhân không tràn.

Lưu ý rằng nó dựa trên thực tế là var được xác định trước i trong lớp (thứ tự trong danh sách trình khởi tạo không liên quan, tất cả những gì quan trọng là thứ tự các thành viên được xác định). Nếu không, i sẽ được khởi tạo bằng cách sử dụng đơn lẻ thành viên dữ liệu var.

Nhưng nếu bạn nhận được hành vi thất thường với chính xác mã đó, thì lỗi nằm ở nơi khác.

5

Có điều này là an toàn, nhưng trong trường hợp này bạn phải cẩn thận. Bạn đang sử dụng var chứ không phải _var, vì vậy bạn phải chắc chắn var được tạo trước i. Đây là trường hợp ở đây, vì các thành viên được xây dựng theo thứ tự khai báo của họ (trong trường hợp này là var, i), có thể khác với thứ tự xuất hiện của chúng trong danh sách khởi tạo.

Vì vậy, trong trường hợp này nó hoạt động. Nó cũng sẽ làm việc trong trường hợp này:

C(int _var): i(var*var), var(_var) 

nhưng không phải trong này:

class C{ 
    public: 
     C(int _var): var(_var), i(var*var) 
     {} 
    private: 
     int i; 
     int var; 
}; 

Nhưng tất nhiên, để luôn ở bên an toàn, bạn chỉ có thể sử dụng _var:

C(int _var): var(_var), i(_var*_var) 
+0

Đã hoạt động! vì vậy thứ tự khởi tạo trong một ctor phụ thuộc vào thứ tự của các biến khai báo trong nguyên mẫu lớp? Điều đó có ý nghĩa! – user965369

+1

@ user965369 Đó là lý do bạn cũng nên liệt kê chúng theo thứ tự này trong danh sách khởi tạo (mà bạn đã làm), để tránh bất kỳ sự nhầm lẫn nào. –

+0

@ user965369: Bạn nên bật cảnh báo trình biên dịch của mình (-Gall trên gcc, \ W3 trên VC++), cảnh báo về danh sách trình khởi tạo không đúng thứ tự là phổ biến và sẽ giúp bạn nhận ra những lỗi đó trước đó. –

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