2011-09-30 35 views
11

Tôi hơi bối rối sau khi đọc nội dung nào đó trong sách giáo khoa. Về mã:Đây có phải là dàn diễn viên hoặc xây dựng không?

void doSomeWork(const Widget& w) 
{ 
    //Fun stuff. 
} 

doSomeWork(Widget(15)); 

doSomeWork() mất một tham số const Widget&. Sách giáo khoa, hiệu quả C++ III, nói rằng điều này tạo ra một đối tượng Widget tạm thời để chuyển tới doSomeWork. Nó cho biết rằng điều này có thể được thay thế bằng:

doSomeWork(static_cast<Widget>(15)); 

vì cả hai phiên bản đều là phôi - đầu tiên chỉ là kiểu C có chức năng. Tôi đã có thể nghĩ rằng Widget(15) sẽ gọi một constructor cho widget lấy một tham số nguyên mặc dù.

Trình tạo hàm có được thực hiện trong trường hợp này không?

Trả lời

12

Trong C++, loại biểu thức này một dạng của diễn viên, ít nhất là về mặt cú pháp. I E. bạn sử dụng cú pháp đúc hàm C++ Widget(15) để tạo đối tượng tạm thời thuộc loại Widget.

Ngay cả khi bạn xây dựng một tạm thời sử dụng một constructor đa đối số (như trong Widget(1, 2, 3)) nó vẫn được coi là một biến thể của chức năng cast ký hiệu (xem 5.2.3)

Nói cách khác, bạn "Is đây là một diễn viên hoặc một câu hỏi xây dựng "không chính xác được nêu ra, vì nó ngụ ý sự độc quyền lẫn nhau giữa phôi và" công trình xây dựng ". Họ không phải là loại trừ lẫn nhau. Trong thực tế, mọi kiểu chuyển đổi (có thể là một phép thuật rõ ràng hoặc một cái gì đó ngầm hơn) là không có gì khác hơn là một tạo ("xây dựng") của một đối tượng tạm thời mới của kiểu đích (không bao gồm, có thể, một số khởi tạo tham chiếu).

BTW, ký pháp đúc chức năng là ký hiệu C++ chính. Ngôn ngữ C không có phôi chức năng.

1

Bạn nói:

là người đầu tiên chỉ là một diễn viên C chức năng theo phong cách rõ ràng

Đầu tiên sẽ không biên dịch trong C, nó không phải là C-phong cách. Kiểu C trông giống như (Widget)15. Ở đây, đối tượng tạm thời được tạo, sử dụng Widget::Widget(int).

Vì vậy, đó không phải là dàn diễn viên kiểu C.

+1

@Constantinius: Chính xác thì có gì sai ở đây? – AnT

+0

Tôi đã chỉnh sửa câu trả lời của bạn. –

-1

Yeeeah. Bạn có thể thay

Widget(15) 

với

static_cast<Widget>(15) 

Bởi vì nó sẽ được thay thế lại bởi trình biên dịch: D

Khi bạn cast int để Widget trình biên dịch tìm kiếm Widget::Widget(int); và đặt nó ở đó.

5

Ngắn: Có.

Long:

Bạn luôn có thể kiểm tra những điều bản thân mình, bằng cách làm ví dụ .:

#include <iostream> 

struct W 
{ 
    W(int i) 
    { 
     std::cout << "W(" << i << ")\n"; 
    } 
}; 

int main(int argc, const char *argv[]) 
{ 
    W w(1); 
    W(2); 
    static_cast<W>(3); 
} 

được xuất ra

W(1) 
W(2) 
W(3) 
+0

Người đầu tiên không phải là diễn viên. Bạn đã cố gắng thể hiện điều gì? – MSalters

+2

@MSalters: Điều đó đối với hầu hết các loại dàn diễn viên không khác với việc tạo đối tượng (tạm thời). – PlasmaHH

+1

@MSalters: Tôi nghĩ anh ấy đang cố gắng thể hiện sự khác biệt –

3

Vâng, nó là cả :). Một dàn diễn viên là một cấu trúc cú pháp (tức là thứ bạn nhập). Trong trường hợp này, một hàm tạo được gọi là kết quả của phép đúc. Giống như một constructor sẽ được gọi là một hệ quả của cách gõ

Widget w(15); 
3

Cả Widget(15)static_cast<Widget>(15) là phôi, hoặc chuyển đổi nhà khai thác, nếu bạn thích. Cả hai tạo một đối tượng mới theo loại được chỉ định, bằng cách chuyển đổi 15 thành một số Widget. Vì 15 không có bất kỳ nhà khai thác chuyển đổi nào , cách duy nhất để thực hiện chuyển đổi này là phân bổ bộ nhớ cần thiết (trên ngăn xếp) và gọi cho nhà xây dựng thích hợp . Điều này thực sự không có khác nhau mà double(15)static_cast<double>(15), ngoại trừ việc chúng ta thường không nghĩ đến double như có một nhà xây dựng (nhưng kết quả double là một đối tượng mới, khác biệt với các 15, trong đó có gõ int).

0

Có, tất nhiên. Bất kỳ hàm tạo nào có một tham số đơn lẻ sẽ được coi là CONVUCION CONSTRUCTOR. Phương thức khởi tạo của bạn đã tham gia một tham số int duy nhất, do đó trình biên dịch có thể "ngầm" gọi hàm khởi tạo này để khớp với đối số (với giá trị 15, là int).

Có một mẹo đơn giản để ngăn chặn các lỗi như vậy, chỉ cần sử dụng từ khóa explicit trước nhà xây dựng của bạn.

Kiểm tra this để biết thêm thông tin.

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