2009-10-03 75 views
6

thể trùng lặp:
Is there a difference in C++ between copy initialization and assignment initialization?Sự khác nhau giữa int x = 1 và int x (1) trong C++ là gì?

Tôi mới đến C++, tôi hiếm khi thấy những người sử dụng cú pháp này để khai báo và khởi tạo một biến:

int x(1); 

tôi đã cố gắng, trình biên dịch không phàn nàn và đầu ra cũng giống như int x = 1, chúng có thực sự giống nhau không?

Rất cám ơn tất cả các bạn.

+2

Dupe: http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-assignment-initializ –

+0

Không hoàn toàn giống nhau. Câu hỏi này dường như đặc biệt về việc khởi tạo POD. – Boojum

Trả lời

13

Có, được xây dựng trong các loại int x = 1;int x(1); giống nhau.

Khi xây dựng các đối tượng thuộc loại lớp thì hai cú pháp khởi tạo khác nhau khác nhau một cách tinh tế.

Obj x(y); 

Đây là trực tiếp khởi và chỉ thị các trình biên dịch để tìm kiếm một nhà xây dựng rõ ràng rằng phải mất y, hoặc cái gì đó y có thể được ngầm chuyển đổi sang, và sử dụng constructor này để khởi tạo x.

Obj x = y; 

Đây là bản sao khởi và chỉ thị các trình biên dịch để tạo ra một tạm thời Obj bằng cách chuyển đổi y và sử dụng bản sao constructor Obj 's để initalize x.

Sao chép initalization tương đương với khởi trực tiếp khi loại y cũng giống như các loại x.

Đối với sao chép initalization, vì tạm thời được sử dụng là kết quả của chuyển đổi ngầm, nhà thầu được đánh dấu explicit không được xem xét. Các nhà xây dựng bản sao cho kiểu xây dựng phải có thể truy cập được nhưng bản thân nó có thể bị loại bỏ bởi trình biên dịch như là một sự lựa chọn.

+0

Và đáng chú ý là Obj x; x = y; tạo ra một biến thể khác.Trong trường hợp này, x sẽ được xây dựng mặc định. Sau đó, tại câu lệnh tiếp theo, toán tử gán sẽ được gọi. –

+3

Một điều đáng lưu ý khác là cho phép các kiểu dữ liệu thuần cũ như int được khởi tạo theo cách này (với cú pháp tương tự như lời gọi của một hàm tạo lớp) cho phép các mẫu làm việc với cả hai loại POD và lớp. – Boojum

+1

@Boojum: Thêm tính năng đó vào ngôn ngữ C++ có nghĩa là cung cấp một cách duy nhất để khởi tạo các đối tượng thuộc bất kỳ loại nào trong danh sách khởi tạo. Điều này là với tôi quan trọng hơn (và phổ biến) hơn khởi tạo bên trong các mẫu, có thể được giải quyết bằng cú pháp 'Type object = other_object'. –

0

Tôi không có chuyên gia C++, nhưng nếu nó mang lại kết quả tương tự, có quan trọng không? Tôi đoán nếu bạn đã thực sự quan tâm, bạn có thể biên dịch (nhưng không lắp ráp) mã của bạn và có một cái nhìn vào sự khác biệt là gì.

Chỉnh sửa: Như đã được đề cập ở nơi khác, chúng thực sự giống nhau đối với các loại nội trang.

+4

Tất nhiên điều đó quan trọng. Bạn có thể thấy kết quả tương tự, nhưng điều đó có thể có nghĩa là bạn không biết những tác dụng phụ nào cần tìm hoặc không biết về tất cả các trường hợp cạnh sẽ cho bạn kết quả khác nhau. Đây là một câu hỏi rất hợp lý từ một lập trình viên mới bắt đầu/trung cấp. – mob

1

Đối với các loại POD, cả hai câu đều giống hệt nhau.

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