2013-06-02 17 views
5

Tôi vừa xem qua các trang ngẫu nhiên trên Cprogramming.com và nhận thấy trang hướng dẫn/ví dụ Constructors and Destructors. Họ đã sử dụng các phương pháp sau đây xác định một constructor:Lợi ích của định nghĩa hàm tạo này là gì

class String 
{ 
    private: 
     char *str; 
     int size; 
    public: 
     String() : str(NULL), size(0) { } // <- This statement 
     String(int size) : str(NULL), size(size) { // <- And this one 
      str = new char[size]; 
     } 
} 

Tôi đã sử dụng tốt định nghĩa lỗi thời cũ của nhà xây dựng với sự kỳ diệu this con trỏ:

String() { 
    this->str = NULL; 
    this->size = 0; 
} 
String(int size) { 
    this->size = size; 
    this->str = new char[size]; 
} 

Có bất kỳ lợi ích bổ sung trong tuyên bố đầu tiên bên cạnh mã nhỏ hơn rõ ràng (ít số dòng)?

PS: Đã một vài năm kể từ lần cuối cùng tôi viết điều gì đó trong C++.

+1

http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list –

Trả lời

11

Đó là constructor initialization lists, và cho loại cơ bản không có sự khác biệt đối với các hình thức bạn đang sử dụng để, mà là dựa trên phân chứ không phải khởi tạo với.

Tuy nhiên, với nhiều loại người dùng định nghĩa có thể có một sự khác biệt về hiệu suất (và ngữ nghĩa có lẽ) giữa:

  1. mặc định-xây dựng một đối tượng và sau đó gán một giá trị cho nó, và
  2. trực tiếp khởi tạo nó với giá trị đó.

Ngoài ra, bạn không có lựa chọn cho những loại không được cấu hình mặc định ngoài việc sử dụng danh sách khởi tạo thành viên để khởi tạo chúng và bạn không có sự lựa chọn cho const và thành viên tham chiếu. được khởi tạo ngay lập tức.

0

đối tượng Xây dựng trong C++ được thực hiện trong ba bước:

  1. Memory được mua lại
  2. biến thành viên được khởi tạo
  3. Các nhà xây dựng được thực thi.

Định nghĩa constructor String() : str(NULL), size(0) {} gán giá trị thích hợp để các biến trong bước 2.

Định nghĩa constructor String() { this->str = NULL; this->size = 0; } thực hiện điều này trong bước 3. Bước 2 là, tuy nhiên, thực thi vẫn. Vì vậy, loại gán giá trị thích hợp cho các biến thành viên là kém hiệu quả.

1

tôi cũng giống như bạn, với kiến ​​thức cắt dán cũ, việc sử dụng này có vẻ lạ. Nhưng sau đó hiểu rằng bằng cách sử dụng kỹ thuật này, triển khai lớp tùy chỉnh cho hiệu suất tốt hơn trên thời gian chạy. Và here là một lời giải thích dài về các danh sách khởi tạo từ cha của C++.