2012-10-21 34 views
8

Tôi muốn biết đối tượng ngoại lệ được tạo ra như thế nào? và tại sao tham số hàm xử lý có thể là tham chiếu không const?Đời sống đối tượng ngoại lệ

Ví dụ:

class E{ 
    public: 
    const char * error; 
    E(const char* arg):error(arg){ 
    cout << "Constructor of E(): ";} 

    E(const E& m){ 
     cout << "Copy constructor E(E& m): " ; 
     error=m.error; 
    } 
}; 



int main(){ 
try{ 
    throw E("Out of memory"); 

} 
catch(E& e){cout << e.error;} 

} 

Output: Constructor của E(): Hết bộ nhớ

vì vậy tôi có throw E("out of memory")E("out of memory") chỉ là một đối tượng tạm thời và không có đối tượng có được tạo ra trừ E("out of memory") vì không có hàm tạo bản sao nào được gọi ra. vì vậy mặc dù điều này E("out of memory") chỉ là một đối tượng tạm thời, tôi có một trình xử lý lấy tham chiếu không phải là const.

Bạn có thể giải thích cho tôi lý do tại sao điều này có thể xảy ra không?

+1

'vì không có hàm tạo bản sao nào được gọi. vì vậy mặc dù E ("bộ nhớ") này chỉ là một đối tượng tạm thời, tôi có một trình xử lý tham chiếu không tham chiếu '- http://en.wikipedia.org/wiki/Copy_elision –

+0

@skwllsp: điều này là do optimization.does nó có nghĩa là đối tượng tạm thời đã không được tạo ra và đối số của nó được chuyển trực tiếp đến đối tượng ngoại lệ? – AlexDan

Trả lời

10

muốn biết đối tượng ngoại lệ được tạo như thế nào?

Khi bạn làm điều này:

throw E("Out of memory"); 

Bạn tạo một đối tượng (loại E) tại địa phương. Các quá trình ném bản sao đối tượng này đến một số vị trí bộ nhớ riêng không được xác định theo tiêu chuẩn. Vì vậy, đối tượng được ném phải được sao chép.

Lưu ý: trình biên dịch được phép tối ưu hóa bản sao và tạo trực tiếp ở vị trí riêng tư. Vì vậy, thực tế là nó không được sao chép là bởi vì trình biên dịch tối ưu hóa các bản sao (vì vậy nó không phải là địa phương nữa). Hãy thử làm cho hàm tạo bản sao riêng tư và bây giờ nó sẽ không biên dịch được.

và tại sao tham số hàm xử lý có thể là tham chiếu không const?

Khi bạn bắt các đối tượng:

catch(E& e) 

Bạn đang nhận được một tham chiếu đến đối tượng tại địa điểm riêng nó đã được sao chép vào. Nó không phải là một giá trị const (hoặc tạm thời) để bạn có thể có một tham chiếu bình thường cho nó.

+0

tham chiếu bắt tốt cho bao lâu? – xaxxon

+0

@xaxxon: http://stackoverflow.com/a/1654187/14065 –

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