2010-06-16 32 views
14
int value = 5; // this type of assignment is called an explicit assignment 
int value(5); // this type of assignment is called an implicit assignment 

Sự khác nhau giữa những điều đó, nếu có, và trong trường hợp nào thì việc phân công rõ ràng và ngầm định khác nhau như thế nào?Sự khác biệt giữa việc gán rõ ràng và tiềm ẩn trong C++


http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx

EDIT: Tôi thực sự chỉ tìm thấy bài viết này, mà làm cho toàn bộ điều rõ ràng hơn rất nhiều ... và nó sẽ trả về một câu hỏi khác, nên bạn (nói chung) nhà xây dựng dấu ấn dùng một tham số duy nhất của một kiểu nguyên thủy - số/bool/string - như là rõ ràng và để phần còn lại như chúng (dĩ nhiên là giữ cho các gotchas chẳng hạn như các hàm tạo như (int, SomeType = SomeType())?

+3

Điều này có mùi giống như bài tập về nhà. Nếu có, vui lòng gắn thẻ như vậy. – greyfade

+0

Không phải bài tập về nhà, chỉ là một lưu ý tôi đã có từ một thời gian dài trước đây mà tôi chưa bao giờ điều tra. Những gì gắn thẻ một cái gì đó như bài tập về nhà làm, anyways? –

+1

Nó làm cho nó rõ ràng câu hỏi là bài tập về nhà. =] Thông thường, mọi người trả lời câu hỏi sẽ thích đưa ra gợi ý để cung cấp toàn bộ câu trả lời. – strager

Trả lời

6

Chúng khác nhau nếu một lớp có một hàm tạo được đánh dấu ' Rõ ràng '. Sau đó, một trong những không làm việc.

Nếu không, không có sự khác biệt.

-1

Chỉ người đầu tiên là bài tập. Cả hai đều khởi tạo.

Chỉnh sửa: thực sự, tôi sai. Không được phân công.

+2

Không ai trong số đó là một sự đảm bảo. Phân công và khởi tạo là các thuật ngữ loại trừ lẫn nhau. – fredoverflow

+0

heh ... giống như tôi đang chỉnh sửa: P –

21

Cả hai loại này đều không được gán bất kỳ loại nào - cả hai đều là khởi tạo. Đầu tiên sử dụng khởi tạo sao chép và khởi tạo trực tiếp thứ hai. (FWIW, tôi khá chắc chắn tôi chưa bao giờ nghe các thuật ngữ "chuyển nhượng rõ ràng" hoặc "chuyển nhượng ngầm" trước đây).

Edit: (Chủ yếu là để đáp lại lời nhận xét của Nathan):

Dưới đây là một phiên bản sửa lại của mã từ bình luận của bạn:

#include <iostream> 

struct Foo { 
    Foo() { 
     std::cout << "Foo::ctor()" << std::endl; 
    } 
    Foo(Foo const& copy) { 
     std::cout << "Foo::cctor()" << std::endl; 
    } 
    Foo& operator=(Foo const& copy) { 
     std::cout << "foo::assign()" << std::endl; 
     return *this; 
    } 
}; 

int main(int, const char**) { 
    Foo f; 
    Foo b(f); 
    Foo x = b; 
    return 0; 
} 

Kết quả từ chạy này sẽ là:

Foo::ctor() 
Foo::cctor() 
Foo::cctor() 

Nếu bạn chạy nó và nhận được một foo::assign(), hãy ném trình biên dịch của bạn đi và lấy một trình biên dịch hoạt động (oh, và cho chúng tôi biết trình biên dịch nào bị hỏng)!

+0

Không * nhất thiết * đúng. Với loại POD, vâng, tuyên bố của bạn là chính xác. Nếu loại được đề cập là do người dùng xác định, thì hoàn toàn có thể có một toán tử gán do người dùng định nghĩa thực hiện chuyển đổi mà không có một hàm tạo bản sao tương tự. Odd, vâng. Tuy nhiên, có thể. –

+0

Ngoài ra, bài đầu tiên là bài tập. Chỉ thứ hai là khởi tạo. Đó là lần đầu tiên có thể và gần như chắc chắn sẽ được inline để khởi tạo một bản sao tương đương không làm giảm nó là một nhiệm vụ. Giả định rằng việc khởi tạo sao chép và chuyển nhượng bản sao giống nhau là thiếu sót và không được bảo đảm. –

+5

@Nathan: Câu trả lời này là chính xác. §8.5/12 định nghĩa "khởi tạo sao chép" là bất kỳ sự khởi tạo nào của biểu mẫu 'T x = a;', và "khởi tạo trực tiếp" là bất kỳ khởi tạo nào của biểu mẫu 'T x (a);'. Cả hai đều khởi tạo. – GManNickG

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