2011-03-10 59 views
7

Tôi đã tìm kiếm một thời gian để giải thích rõ lý do tại sao/tại sao không sử dụng công cụ xây dựng struct như một đối số hàm là hợp pháp. Ai đó có thể cung cấp?Sử dụng hàm tạo trong một cuộc gọi hàm?

// Begin simple illustrative example C++ program  
#include<vector.h> 

struct Item 
{ 
    Item(double data, const int lead) 
    : m_grid(data), m_lead(lead) {} 

    double m_grid; 
    int m_lead; 
}; 

int main() 
{ 
    double img = 0.0; 
    int steps = 5; 
    std::vector<Item> images; 
    for (int i = 0; i < steps; i++) 
    { 
    img += 2.0; 
    images.push_back(Item(img,i)); 
    } 
    return 0; 
} 

Tôi đã theo ấn tượng một constructor có không phải là một kiểu trả về cũng không tuyên bố ...

+1

Có phải là C++ không? Vui lòng chỉ định ngôn ngữ của bạn. –

+0

Xin lỗi, có, C++ – Evan

Trả lời

4

Điều đó là hợp pháp.

Bạn không bao giờ tự gọi cho nhà xây dựng; bạn thực sự chỉ tuyên bố một đối tượng không tên hoặc "tạm thời" loại Item. Xem cách cú pháp tiến hóa khi bạn đặt đối tượng chưa được đặt tên:

Item a(img,i); // normal 
Item(img,i); // temporary 

Mặc dù có vẻ như bạn đang gọi hàm tạo giống như hàm, bạn thì không.

Dù sao, bạn có thể sử dụng tạm thời làm "rvalue" (vì nó là một) trong đối số chức năng và tương tự, đó là những gì bạn đang làm ở đây.


BTW, không sử dụng cái cũ iostream.hvector.h tiêu đề. Chúng có trước năm 1998. Trong ISO Standard C++, bạn nên sử dụng tương ứng iostreamvector. Tiêu đề tiêu chuẩn trong C++ không kết thúc bằng ".h" (inb4, bỏ qua các tiêu đề C được kế thừa để tương thích ngược).

4

này là hợp pháp, vì push_back mất nó lập luận bằng cách tham chiếu const, và sau đó tạo ra một bản sao của đối tượng. Các cuộc gọi của constructor tạo ra một đối tượng tạm thời, đó là một rvalue. Tham chiếu const có thể ràng buộc một giá trị. Phương thức không thể sửa đổi đối tượng được truyền, nhưng nó có thể tạo một bản sao.

+0

Không, lập trình viên không bao giờ gọi hàm tạo. Tôi biết những gì bạn đang nói nhưng tôi nghĩ rằng lời nói của bạn là gây hiểu lầm. –

3

Mặc dù có vẻ giống như một cuộc gọi hàm, biểu thức Mục (img, i) thực sự là việc tạo đối tượng tạm thời. Sự khác biệt là trong thời gian chạy, bộ nhớ sẽ được cấp phát cho đối tượng trên stack, và sau đó constructor sẽ được gọi, trong khi nếu đây là một hàm gọi thông thường thì không có bộ nhớ nào được cấp phát.

+0

Cộng với tất cả những thứ khác liên quan đến việc xây dựng một đối tượng. –

8

Đó không phải là hàm tạo hoặc giá trị trả lại được chuyển đến push_back. C++ thực sự sử dụng hàm tạo để tạo một đối tượng tạm thời không tên, chỉ tồn tại trong suốt thời gian gọi hàm; thông thường, trên ngăn xếp. Sau đó, nó được chuyển đến push_backpush_back sao chép nội dung của nó vào vectơ của bạn.

+5

+1. "thời gian của biểu thức" có thể tốt hơn, mặc dù. –

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