2013-03-28 28 views
14

Chúng ta hãy xem xét các lớp sauConstructor khởi Vs phân

class test1 
{ 
    private: 
     int a; 
     int b; 
    public: 
     test1():a(0),b(0){} 
}; 

class test2 
{ 
    private: 
     int a; 
     int b; 
    public: 
     test2() 
     { 
      a=0; 
      b=0; 
     } 
}; 

Bây giờ, tôi biết rằng test1() constructor là đúng cách để khởi tạo các thành viên dữ liệu của một class, bởi vì trong test2() chúng tôi đang thực hiện nhiệm vụ và không khởi tạo. Câu hỏi của tôi là:

  1. Điều gì có thể xảy ra nếu chúng tôi thực hiện bài tập thay vì khởi tạo?
  2. Trình biên dịch không thực hiện nhiệm vụ trong trường hợp của nhà xây dựng test1()? Nếu không thì các khởi tạo này như thế nào?
+5

Xem http://www.parashift.com/c++-faq/init-lists.html – hmjd

+0

xem câu trả lời này ... http://stackoverflow.com/questions/13894415/c-creating-objects-initialization- danh sách-so-chuyển nhượng – Caribou

Trả lời

14

Điều gì có thể xảy ra nếu chúng tôi thực hiện bài tập thay vì khởi tạo?

Không thể chỉ định một số loại lớp (cũng như tham chiếu và const đối tượng); một số không thể được khởi tạo mặc định; một số có thể tốn kém hơn để khởi tạo mặc định và gán lại hơn để khởi tạo trực tiếp.

Trình biên dịch không thực hiện nhiệm vụ trong trường hợp hàm tạo test1()? Nếu không thì các khởi tạo này như thế nào?

Trong trường hợp các loại nguyên thủy như int, có rất ít hoặc không có sự khác biệt thực tế giữa hai loại. Việc khởi tạo mặc định không làm gì cả, và khởi tạo trực tiếp và gán cả hai đều thực sự giống nhau.

Trong trường hợp các loại lớp, khởi tạo mặc định, gán và khởi tạo trực tiếp, mỗi hàm gọi các hàm do người dùng định nghĩa khác nhau và một số thao tác có thể không tồn tại; vì vậy nói chung hai ví dụ có thể có hành vi rất khác nhau.

9

Ví dụ của bạn không có khác biệt thực sự vì bạn đang khởi tạo số nguyên đơn giản.

Nhưng giả định các số nguyên là các đối tượng với nhà thầu, sau đó trình biên dịch sẽ tạo ra các cuộc gọi sau đây:

// test1 
a::copy_constructor(0); 
b::copy_constructor(0); 


// test2 
a::default_constructor(); 
b::default_constructor(); 
a::operator = (0); 
b::operator = (0); 

Vì vậy, tùy thuộc vào đối tượng của bạn test2 có thể có một tác động hiệu quả rất lớn. Cũng bằng cách khởi tạo các đối tượng của bạn trong danh sách khởi tạo bảo đảm rằng các biến của bạn có dữ liệu khi bạn nhập hàm tạo. Một 'nhược điểm' của danh sách khởi tạo là nó được thực hiện theo thứ tự mà các biến được khai báo và không theo thứ tự của danh sách khởi tạo, vì vậy có thể là bạn không muốn sử dụng danh sách khởi tạo.

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