Không, một hàm tạo object
rất khác với hàm được gọi object
và trả về object
. Một constructor không có tên, nhưng đó phần lớn là một kỹ thuật. Sự khác biệt quan trọng hơn là một hàm tạo không có kiểu trả về và nó không thể được gọi trực tiếp.
Một constructor không trả về bất cứ thứ gì vì nó được cung cấp một khối bộ nhớ và hoạt động trên bộ nhớ đó tại chỗ. Nó có thể hữu ích nếu bạn quên tên "constructor" trong giây lát và nghĩ về nó như là công cụ khởi tạo thay thế. Mục đích của nhà xây dựng không phải là để xây dựng một vật thể "ngoài không khí mỏng". Mục đích của nó là khởi tạo một đối tượng tại vị trí chính xác trong bộ nhớ mà nó cần.
Nếu một hàm tạo trả về một đối tượng, thì đối tượng trả về đó (giá trị trả về) sẽ phải sống ở đâu đó (có thể trên ngăn xếp), và ở đó, nó sẽ cần được khởi tạo bằng cách nào đó - chúng ta đang chạy vào một vòng lặp ở đây.
Điều này đi đôi với thực tế là một nhà xây dựng không bao giờ có thể được gọi trực tiếp. Nếu bạn có một lớp object
và sử dụng một biểu thức object()
ở đâu đó, thì nó không có ngữ nghĩa của "gọi hàm tạo của object
." Nó có ngữ nghĩa của "tạo một đối tượng tạm thời của loại object
." Trình biên dịch chuyển điều này thành phân bổ một số vị trí cho tạm thời để sống (có thể / thường là trên ngăn xếp) và gọi hàm tạo để xây dựng (= khởi tạo) một đối tượng ở vị trí đó.
Nguyên tắc tương tự áp dụng khi sử dụng new object()
. Đây là một biểu thức mới, thực hiện hai điều:
- Gọi một hàm phân bổ
operator new
(trả về a void*
) để cấp phát bộ nhớ thô cho đối tượng.
- Phát hành lệnh gọi hàm tạo trên bộ nhớ thô này để xây dựng (= khởi tạo) một đối tượng trong đoạn bộ nhớ thô đó.
Suy nghĩ của một nhà xây dựng object
như là một chức năng như thế này:
static object object();
sai. Nếu bất cứ điều gì, cách một nhà xây dựng làm việc gần hơn với điều này:
static void object(object &place_to_work_in);
Với ngoại lệ là bạn không bao giờ có thể gọi nó trực tiếp. Nó luôn chỉ được gọi khi được chỉ định bởi một cấu trúc ngôn ngữ khác. Ngay cả vị trí mới (còn được gọi là thủ thuật "gọi hàm tạo ở đây"), new (&place_for_object) object()
không gọi trực tiếp hàm tạo. Nó chuyển thành một cuộc gọi đến hình thức vị trí mới trong operator new
đó trả về đối số của nó, theo sau là một cuộc gọi đến hàm tạo (giống như bất kỳ biểu thức mới nào khác).