2012-03-17 48 views
8

Đây là một câu hỏi rất cơ bản, tôi đã tìm kiếm nhưng tôi chỉ muốn hỏi cộng đồng này rằng chúng tôi có cả hai số constructorsmethods. Nhưng thông thường chúng ta sử dụng hàm tạo để khởi tạo các biến thay vì các phương thức. Tôi nghĩ rằng cả hai có thể được sử dụng để khởi tạo các biến. Vậy sự khác biệt cơ bản giữa cả hai. Có lý do vững chắc nào không? đây là một câu hỏi rất cơ bản, do đó, nó vì lợi ích của cấp độ mới bắt đầu. cảm ơn trước ..Tại sao hàm tạo được sử dụng thay cho hàm?

Trả lời

6

Sự khác biệt quan trọng nhất: Khi bạn khởi tạo đối tượng, hàm tạo của nó sẽ được gọi trong khi gọi phương thức luôn là tùy chọn. Do đó, bạn có thể quên gọi phương thức khởi tạo của mình và không khởi tạo mọi thứ chính xác.

Ví dụ, tất cả những cách bình thường của instantiating một đối tượng sẽ gọi constructor

Foo* p = new Foo(); 
Foo p; 

Hoặc nếu bạn có đối số bắt buộc, không định nghĩa một constructor mặc định và thay vào đó yêu cầu xây dựng với các thông số:

class Foo 
{ 
private: 
    Foo(); 
public: 
    Foo(int param1, double param2) 
}; 

Điều này có lợi thế là yêu cầu đối số trước khi bạn khởi tạo lớp. Vì vậy, bạn buộc phải làm:

Foo* p = new Foo(1, 5.0); 

và thất bại trong việc xây dựng với các đối số hợp lệ trở thành một lỗi biên dịch:

Foo* p = new Foo(); // compiler error 

Vì vậy, bất cứ khi nào có thể, luôn luôn sai lầm về mặt làm khởi tạo của bạn trong một constructor . Có một vài trường hợp mà một nhà xây dựng có thể không khả thi. Ví dụ, cách duy nhất để thất bại một hàm tạo là bằng cách sử dụng một ngoại lệ. Việc không xây dựng có thể là "thường lệ" và không thực sự đặc biệt. Ngoài ra trường hợp ngoại lệ có thể tốn kém trên một số kiến ​​trúc. Một trường hợp khác có thể là khi bạn muốn đảm bảo rằng các phương thức ảo được ràng buộc hoàn toàn, được đảm bảo là đúng chỉ sau khi xây dựng.

+0

Thực ra tôi đang yêu cầu khởi tạo với một số giá trị do người dùng yêu cầu, giả sử rằng với mục đích mô phỏng, chúng ta phải khởi tạo khoảng 20 biến cho các giá trị đã cho. Nếu tôi khởi tạo mỗi biến một cách chính xác thì trong trường hợp này bạn sẽ dính vào đối số của bạn? –

+0

@kashmirilegion xem các chỉnh sửa của tôi. Nếu bạn cần khởi tạo 20 biến, bạn có thể xác định một hàm tạo có 20 biến hoặc một biến có cấu trúc. –

+0

. cảm ơn rất nhiều –

3

Chúng không thể được sử dụng để khởi tạo biến thành viên. Đây là công việc của hàm khởi tạo để khởi tạo các thành viên, và nó được gọi tự động bất cứ khi nào bạn tạo một cá thể mới.

xem xét như sau:

class Foo { 
public: 
    // Constructor 
    Foo() : x(53) // Initialise x 
    {} 

    void bar() { 
     x = 42;  // Error, attempt to *assign* a const member! 
    } 

private: 
    const int x; 
}; 

Nếu không có các nhà xây dựng, sẽ có không có cách nào để khởi viên x.

+0

Đó là tất cả tốt và tốt cho đến khi bạn cần phải trả lại một mã lỗi khi chạy. : P – chrisaycock

+0

@chrisaycock: Touché. Nhưng luôn có ngoại lệ ... –

+0

+1 cho câu trả lời hay của bạn. cảm ơn bạn lập luận của bạn đã cho sức mạnh để tâm trí để làm cho một cách rõ ràng về các nhà thầu. –

0

Hàm tạo được gọi tự động khi bạn tạo đối tượng không giống như hàm. Ngoài ra, hàm tạo được sử dụng để cho biết ý định rằng điều này là để khởi tạo đối tượng.

0

Hãy tưởng tượng bạn có biến thành viên không có hàm tạo trống. Sau đó, bạn không có tùy chọn nào khác ngoài việc khởi tạo nó trong danh sách khởi tạo của hàm tạo của bạn.

Ngoài ra hàm tạo được gọi khi bạn cấp phát một mảng với toán tử mới, trong khi khởi tạo với các phương thức sẽ làm cho cách mã phức tạp hơn. Nói chung có logic phức tạp trong constructor không phải là ý tưởng rất tốt, nhưng khởi tạo đơn giản nên được thực hiện ở đó (những thứ bạn cần làm để đảm bảo rằng đối tượng của bạn đang ở trạng thái hợp lệ).

1

Trình xây dựng được gọi tự động, vì vậy không cần phải lo lắng liệu người dùng đã gọi phương thức khởi tạo chưa. Tuy nhiên, số Google style guide does have something to say about constructors:

  • Không có cách nào dễ dàng để người xây dựng báo lỗi, thiếu ngoại lệ khi sử dụng.
  • Nếu công việc không thành công, bây giờ chúng tôi có một đối tượng có mã khởi tạo không thành công, do đó, nó có thể là trạng thái không xác định.
  • Nếu công việc gọi các hàm ảo, các cuộc gọi này sẽ không được gửi đến các triển khai lớp con. Sửa đổi tương lai cho lớp học của bạn có thể lặng lẽ giới thiệu vấn đề này ngay cả khi lớp học của bạn hiện không được phân lớp, gây ra nhiều nhầm lẫn.
  • Nếu ai đó tạo biến toàn cầu thuộc loại này, mã của hàm tạo sẽ được gọi trước hàm main(), có thể phá vỡ một số giả định ngầm định trong mã của hàm tạo.

Đề xuất của Google là có sự khởi đầu đơn giản trong một nhà xây dựng và khởi đầu không tầm thường theo một phương pháp riêng biệt.

+0

Đó là tất cả tốt và tốt, trừ khi bạn là một fan hâm mộ của các đối tượng bất biến. –

+0

Đối số chính để làm theo hướng dẫn về phong cách C++ của Google dường như là Big Name.Tôi hoàn toàn không thích quan điểm của họ trên (không) sử dụng ngoại lệ. Nếu bạn không sử dụng ngoại lệ, bạn đang sử dụng kiểu C++ rất giống C. Một chuyên gia C++ nổi tiếng đã từng nói: http://www2.research.att.com/~bs/3rd_safe0.html Để trả lời danh sách có dấu đầu dòng của bạn: (1) thì chỉ cần sử dụng ngoại lệ (bạn vừa phát hiện ra rằng có cần thiết để sử dụng constructors/RAII) (2) lần nữa, bạn sẽ không có đối tượng không hợp lệ nếu bạn ném một ngoại lệ (3) Tôi đồng ý, một số vấn đề khó chịu có thể phát sinh, trình biên dịch sẽ cảnh báo bạn. (4) vì vậy, không có mã trong các nhà thầu? – Andre

0

Khởi tạo biến là không có nghi ngờ, một thực hành lập trình rất quan trọng. khi sử dụng các lớp, tùy chọn là để khởi tạo chúng bên trong các phương thức. Do đó, chúng ta có hai bước sau: -

  1. Xác định phương pháp
  2. Gọi phương pháp để thực hiện việc khởi tạo

Nhưng nếu 'kêu gọi của phương pháp' được quên, biến kết thúc có giá trị rác . Để làm cho cuộc sống dễ dàng hơn cho các lập trình viên, khái niệm về một phương pháp xây dựng đã được đưa vào

Với Constructors, chúng tôi chỉ có một bước: -.

  1. Xác định các nhà xây dựng

Các 'gọi phần' là được thực hiện tự động bất cứ khi nào một đối tượng mới của lớp được tạo ra.

0

Các nhà xây dựng có thể được sử dụng để quản lý bộ nhớ hiệu quả, điều này không thể thực hiện được với các chức năng.

Destructor có thể được sử dụng để phá hủy các nhà thầu khi không cần thiết.

Hơn nữa, việc sử dụng hàm tạo bản sao được biết là ngăn ngừa các sự cố hoặc lỗi do sự cố xảy ra với bộ nhớ.

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