2012-07-20 13 views
5

Lớp X -> được chuyển đổi thành Y theo hai cách 1) hàm tạo và 2) theo hàm chuyển đổi.
Tôi hiểu rằng hàm tạo đối số đơn được sử dụng để chuyển đổi.Chuyển đổi bởi các hàm tạo

Trong đặc điểm kỹ thuật:

Một ngầm-tuyên bố constructor sao chép không phải là một nhà xây dựng rõ ràng; nó có thể được gọi cho chuyển đổi loại tiềm ẩn.

Câu hỏi:

Vì vậy, có nghĩa là không chỉ xây dựng đối số duy nhất được sử dụng cho việc chuyển đổi, mà còn sao chép constructor ?. Nếu vậy, kịch bản nào được sử dụng ?. bất kỳ đoạn mã mẫu nào?

Vui lòng chịu với tôi nếu câu hỏi là rất cơ bản.

+1

Trình tạo bản sao là một hàm tạo đối số đơn. Nhưng nó không thay đổi loại, vì vậy tôi không biết tại sao bất cứ ai gọi nó là "chuyển đổi". –

+1

Tôi khá chắc chắn vợ tôi sẽ khó chịu nếu tôi "trần với" bạn. :-) –

+0

haha, Jerry, Cảm ơn bạn đã chỉ ra. :) – Whoami

Trả lời

1

Trình tạo bản sao được khai báo ngầm không thể sử dụng cho chuyển đổi, vì nó là copy-ctor, đã được khai báo là T(const T&) hoặc T(T&).

dự thảo n3337 par 12.8 Tiêu chuẩn C++.

8 Các ngầm-tuyên bố constructor sao chép cho một lớp X sẽ có dạng X :: X (const X &) nếu - mỗi lớp cơ sở B trực tiếp hoặc ảo của X có một constructor sao chép có tham số đầu tiên thuộc loại const B & hoặc const dễ bay hơi B & và - cho tất cả các thành viên dữ liệu không tĩnh của X là của loại M (hoặc mảng của chúng), mỗi loại lớp đó có một bản sao . tham số là loại const M & hoặc const biến động M & .119 Nếu không, việc khai báo ngầm d copy constructor sẽ có dạng X :: X (X &)

Kể từ bản sao c-tor là không rõ ràng, bạn có thể sử dụng mã như

struct So 
{ 
}; 

int main() 
{ 
    So s = So(); 
} 

Nếu copy-ctor là rõ ràng bạn có thể sử dụng chỉ bắt đầu như So s((So()));

+0

Nó có thể được gọi là một chuyển đổi từ T đến T vì lợi ích của tổng quát. –

+0

@SergeyK. "có thể" giống như "is". Đây có phải là một chuyển đổi hay không? – curiousguy

+0

@curiousguy: kiểm tra .pdf trong câu trả lời của tôi –

3

Trình tạo bản sao không phải là một hàm tạo rõ ràng, vì vậy nó sẽ được sử dụng bất cứ khi nào có thể. Sao chép constructor sẽ "chuyển đổi" chỉ từ cùng một loại, do đó, nó không phải là một chuyển đổi theo nghĩa đầy đủ. Tuy nhiên, vì lợi ích của tính tổng quát, thật thuận tiện để gọi nó là một.

Đọc bài báo này: http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf nếu bạn muốn biết thêm chi tiết về các nhà xây dựng chuyển đổi.

+0

"_Copy constructor không phải là một hàm tạo rõ ràng, vì vậy nó sẽ được sử dụng bất cứ khi nào có thể._" Và một hàm tạo rõ ràng sẽ được sử dụng bất cứ nơi nào không thể. – curiousguy

+0

@curiousguy: vì vậy chúng khá giống nhau, phải không? –

1

Trình tạo bản sao ẩn là trình biên dịch viết cho bạn. Nó luôn luôn có dạng

T(const T&); 

này có nghĩa là bất kỳ đối tượng trong đó có một nhà điều hành chuyển đổi sang const T& thể được sao chép ngầm, ngay cả khi đây không phải là những gì bạn muốn. Cách phổ biến nhất để kích hoạt điều này là tạo một bản sao cho một lớp cơ sở từ một lớp dẫn xuất; điều này được gọi là đối tượng cắt vì bản sao sẽ không có cùng loại với bản gốc và có thể sẽ mất một số thuộc tính hoặc hành vi quan trọng.

+3

Không phải lúc nào. 12.8 mệnh đề mệnh đề 8 n3337 dự thảo. – ForEveR

+0

@ForEveR, cảm ơn vì đã chỉ ra điều đó - Tôi không biết có ngoại lệ. Tôi vẫn còn có một thời gian khó tưởng tượng những gì các trường hợp cạnh thực tế là từ đọc các tiêu chuẩn. –

+1

@Mark: Về cơ bản, nếu lớp của bạn chứa 'auto_ptr' (tại sao bạn, vì' unique_ptr' được thêm vào?), Thì "constructor copy" được tạo ngầm của bạn sẽ có ngữ nghĩa di chuyển. –

2

Nó về cơ bản có nghĩa là bạn có thể làm:

struct A {}; 
A a; 
A b = a; 

Nếu các nhà xây dựng bản sao được đánh dấu rõ ràng rằng sẽ không biên dịch. Bạn có thể kiểm tra nó bằng cách thêm: explicit A(A const &) {} vào cấu trúc và biên dịch lại chương trình.

+0

Đó có phải là một chuyển đổi không? – curiousguy