2012-12-04 30 views
8

thể trùng lặp:
What’s the motivation behind having copy and direct initialization behave differently?Tại sao bản sao khởi tạo theo cách đó? Tại sao yêu cầu các nhà xây dựng bản sao?

Và bằng cách sao chép khởi, ý tôi là như vậy:

struct MyStruct 
{ 
    MyStruct(int) {} 
    MyStruct(const MyStruct&) {} 
}; 

MyStruct s = 5; // needs *both* the int and copy constructor 

Mặc dù lập trình trong C++ trong nhiều năm qua, tôi không bao giờ nhận ra đoạn mã trên yêu cầu các nhà xây dựng bản sao (nhờ jogojapan). Tạm thời luôn luôn được elided, và như vậy tôi thậm chí không bao giờ biết nó thậm chí còn tồn tại (ít nhất là trên một bề ngoài cấp, mặc dù nó được tối ưu hóa đi) cho đến khi nó đã được chỉ ra cho tôi.

Sau một số lượng khá googling, tôi có ý tưởng về cách hoạt động của nó. Câu hỏi của tôi là lý do tại sao là nó như vậy?

Tại sao tiêu chuẩn không làm cho ví dụ trên không cần hàm sao chép? Có một số trường hợp cụ thể/ví dụ cho thấy rằng yêu cầu các nhà xây dựng bản sao trong loại hình khởi tạo là quan trọng?

Nếu không có giải thích hợp lý về lý do tại sao chúng là gì, tôi chỉ xem đây là một tạo tác gây phiền nhiễu, nhưng tôi không muốn không biết nếu có điều gì đó quan trọng mà tôi đang thiếu.

+0

Có vẻ như cần xây dựng sao chép cho việc đặt tên; thực sự nó [không được gọi] (http://ideone.com/35fjAD). – iammilind

+0

@iammilind: Nó không cần được gọi là do ** Copy elision **, nhưng constructor sao chép cần phải được truy cập. Về cơ bản, nó có nghĩa là tiêu chuẩn * cho phép * copy constructor được gọi và nó ** phải ** có sẵn. Tối ưu hóa không phải là tiêu chuẩn đảm bảo infact của nó trái ngược với tiêu chuẩn cho. –

+1

@JesseGood: Cảm ơn vì điều đó. Có vẻ như đây là một bản sao khá nhiều. Loại thất vọng không có câu trả lời hay cho câu hỏi khác ... – Cornstalks

Trả lời

0

Sao chép khởi tạo đối tượng không rõ ràng để khởi tạo trực tiếp, cả hai có thể được sử dụng ở cùng mức độ để đặt giá trị bằng nhau.

int a = 4; 
int a = int(4); 
int a(4); 

tất cả các cuộc gọi là mơ hồ, tất cả họ đều thiết lập một bằng 4. Lý do cho một nhà xây dựng bản sao trong trường hợp của một số nguyên là thuận tiện, hãy tưởng tượng C++ kiểu dữ liệu mà không cần này

int a(foo(b,r)); //a little messy for a variable declaration 
int a = foo(b,r) //ok, cleaner 

bạn cũng có thể sử dụng một hàm tạo bản sao ngầm và rõ ràng, đây là một chương trình ví dụ sử dụng một hàm tạo bản sao một cách rõ ràng để xử lý các số ảo:

#include <iostream> 
using std::cout; 
using std::endl; 
class complexNumbers { 
    double real, img; 
public: 
    complexNumbers() : real(0), img(0) { } 
    complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; } 
    explicit complexNumbers(double r, double i = 0.0) { real = r; img = i; } 
    friend void display(complexNumbers cx); 
}; 
void display(complexNumbers cx){ 
    cout<<&quot;Real Part: &quot;<<cx.real<<&quot; Imag Part: &quot;<<cx.img<<endl; 
} 
int main() { 
    complexNumbers one(1); 
    display(one); 
    complexNumbers two =2; 
    display(200); 
    return 0; 
} 
Các vấn đề liên quan