Trong lập trình hướng đối tượng dựa trên lớp, hàm tạo (tiếng Anh: constructor, viết tắt: ctor) trong một lớp là một kiểu chương trình con đặc biệt được dùng để tạo ra đối tượng. Nó chuẩn bị đối tượng mới để sử dụng, thường chấp nhận các đối số mà hàm tạo dùng để thiết lập các biến thành viên bắt buộc.
Một hàm tạo có vẻ giống như là phương thức thực thể, nhưng nó khác phương thức vì nó không có kiểu trả về rõ ràng, nó không được kế thừa ngầm và nó thường có các quy tắc khác nhau để chỉ định tầm vực. Hàm tạo thường có tên giống với lớp được khai báo. Chúng có nhiệm vụ khởi tạo thành viên dữ liệu của đối tượng và thiết lập bất biến của lớp, thất bại nếu bất biến không hợp lệ. Một hàm tạo được viết tốt sẽ cho kết quả đối tượng với trạng thái hợp lệ. Đối tượng bất biến phải được khởi tạo trong hàm tạo.
Các lập trình viên cũng hay dùng thuật ngữ hàm tạo để chỉ một trong những thẻ đóng gói dữ liệu trong một kiểu dữ liệu đại số. Nó là một cách dùng khác với bài viết này.
Hầu hết các ngôn ngữ cho phép chồng hàm tạo vì vậy một lớp có thể có nhiều hơn một hàm tạo với các tham số khác nhau. Một vài ngôn ngữ còn xem xét một số loại hàm tạo đặc biệt. Hàm tạo, sử dụng một lớp duy nhất để tạo đối tượng và trả về một thực thể mới của lớp đó, được trừu tượng hóa bởi factory, cũng có thể tạo ra đối tượng nhưng với nhiều cách, sử dụng nhiều lớp hay các phương thức phân bổ khác nhau như một vùng chứa đối tượng (object pool).
Các loại hàm tạo
Hàm tạo tham số
Hàm tạo tham số (parameterized constructor) là hàm tạo có kèm theo ít nhất một đối số. Ví dụ:
class Example
{
int x, y;
public:
Example();
Example(int a, int b); // Parameterized constructor
};
Example:: Example()
{
}
Example:: Example(int a, int b)
{
x = a;
y = b;
}
Khi một đối tượng được khai báo trong hàm tạo tham số, giá trị ban đầu phải được truyền qua như là đối số của hàm tạo. Cách thông thường để khai báo đối tượng có thể không hoạt động. Hàm tạo có thể được gọi tường minh hay ngầm. Phương thức gọi hàm tạo ngầm còn được gọi là phương thức _tốc ký_ (_shorthand_).
Example e = Example(0, 50); // Explicit call
Example e(0, 50); // Implicit call
Hàm tạo mặc định
Nếu lập trình viên không cung cấp hàm tạo cho một lớp, hầu hết mọi ngôn ngữ đều cung cấp một hàm tạo mặc định (default constructor).
Hành vi của hàm tạo mặc định phụ thuộc vào ngôn ngữ. Nó có thể khởi tạo các thành viên dữ liệu về số 0 hay giá trị tương đương, hoặc có thể không làm gì.
Một số ngôn ngữ (Java, C#, VB.NET) sẽ mặc định tạo mảng của các kiểu lớp để chứa tham chiếu rỗng. Ngôn ngữ không có tham chiếu rỗng có thể không cho phép xây dựng mặc định các mảng của đối tượng không được xây dựng mặc định, hay yêu cầu khởi tạo tường minh tại thời điểm tạo (C++):
#include
class student{
public:
int a,b;
student(a=0,b=0) //default constructor
};
int main() {
}
Hàm tạo sao chép
Hàm tạo sao chép (copy constructor) định nghĩa các hành động được thực hiện khi trình biên dịch sap chép đối tượng lớp. Một hàm tạo sao chép có một tham số chính thức là kiểu của lớp (tham số đó có thể tham chiếu tới một đối tượng).
Nó được sử dụng để tạo ra một bản sao của một đối tượng có sẵn của cùng lớp. Mặc dù cả hai lớp giống nhau, nó được tính như là một hàm tạo chuyển đổi.
Mặc dù hàm tạo sao chép thường được viết tắt là copy ctor hay cctor, nó không có liên quan gì đến hàm tạo lớp (class constructor) được dùng trong .NET dù được viết tắt giống nhau.
Hàm tạo chuyển đổi
Hàm tạo chuyển đổi (conversion constructor) cung cấp một phương tiện cho trình biên dịch để ngầm tạo một đối tượng dựa trên một đối tượng khác không cùng kiểu. Các hàm tạo này thường được ngầm gọi để chuyển các đối số hoặc toán hạng sang một kiểu thích hợp, nhưng chúng cũng có thể được gọi tường minh.
Hàm tạo di chuyển
Trong C++, hàm tạo di chuyển (move constructor) lấy giá trị tham chiếu tới một đối tượng của lớp, và được dùng để hiện thực chuyển quyền sở hữu tài nguyên của đối tượng tham số.
Cú pháp
- Java, C++, C#, ActionScript, và có quy ước đặt tên, trong đó hàm tạo cùng tên với tên lớp mà nó liên kết với.
- Trong PHP 5, tên được đề nghị cho hàm tạo là
construct
. Vì lí do tương thích ngược, một phương thức có cùng tên với lớp sẽ được gọi nếu không tìm thấy phương thức construct
. Kể từ PHP 5.3.3, điều này chỉ hoạt động với các lớp không có không gian tên miền (non-namespaced class).
- Trong Perl, theo quy ước, hàm tạo được đặt tên "new" và cần phải làm nhiều thứ để tạo đối tượng.
- Trong hệ thống đối tượng Moose của Perl, hàm tạo (được đặt tên new) được tạo tự động và mở rộng bằng cách đặc tả một phương thức BUILD.
- Trong Visual Basic.NET, hàm tạo được gọi là "
New
".
- Trong Python, hàm tạo được chia thành 2 phương thức, "
new
" và "init
". Phương thức new
chịu trách nhiệm phân bổ bộ nhớ cho thực thể và nhận lớp như một đối số (theo quy ước gọi là "cls
"). Còn phương thức init
(thường gọi là "người khởi tạo" - initialiser) được truyền qua thực thể mới tạo ra như là một đối số (theo quy ước gọi là "self
").
- Hàm tạo trong Object Pascal được biểu thị bằng từ khóa "
constructor
" và có thể có tên do người dùng định nghĩa (nhưng hầu hết được gọi là "Create
").
- Trong Objective-C, hàm tạo được chia thành 2 phương thức, "
alloc
" và "init
" với phương thức alloc
để cấp phát bộ nhớ cho thực thể của lớp, và phương thức init
xử lý phần lớn việc khởi tạo đối tượng. Một lời gọi tới phương thức "new
" sẽ gọi tới cả phương thức alloc
và init
, với thực thể lớp.
👁️
3 | 🔗 | 💖 | ✨ | 🌍 | ⌚
Trong lập trình hướng đối tượng dựa trên lớp, **hàm tạo** (tiếng Anh: _constructor_, viết tắt: _ctor_) trong một lớp là một kiểu chương trình con đặc biệt được dùng để tạo ra đối tượng.
**Lập trình hướng đối tượng** () là một mẫu hình lập trình dựa trên khái niệm "đối tượng", mà trong đó, đối tượng chứa đựng các dữ liệu trong các trường, thường được gọi là
Đây là danh sách các thuật ngữ tìm thấy trong lập trình hướng đối tượng. Một số có liên quan đến lập trình hướng đối tượng và một số thì không. Lưu ý rằng, các
thumb|Phương thức Factory trong [[LePUS3]] Trong lập trình hướng đối tượng (OOP), **factory** (_nhà máy_) là một đối tượng để tạo đối tượng khác – một cách chính thức thì factory là một hàm hay
**C#** (**C Sharp**, đọc là _"xi-sáp"_) là một ngôn ngữ lập trình hướng đối tượng đa năng, mạnh mẽ được phát triển bởi Microsoft, C# là phần khởi đầu cho kế hoạch .NET của họ.
**Ruby** là một ngôn ngữ lập trình hướng đối tượng, có khả năng phản ứng. Theo tác giả, Ruby chịu ảnh hưởng bởi Perl, Smalltalk, Eiffel, Ada và Lisp. Ruby cung cấp nhiều mẫu hình
**Python** () là ngôn ngữ lập trình bậc cao đa năng. Triết lý thiết kế của nó nhấn mạnh khả năng đọc mã bằng cách sử dụng thụt lề đáng kể. Python có kiểu động
**D** là một ngôn ngữ lập trình hệ thống hướng đối tượng, dùng câu lệnh, đa mẫu hình do Walter Bright của Digital Mars tạo ra và phát hành năm 2001. Quá trình thiết kế
**Kotlin** là một ngôn ngữ lập trình kiểu tĩnh chạy trên máy ảo Java (JVM) và có thể được biên dịch sang mã nguồn Java hay sử dụng cơ sở hạ tầng trình biên dịch
**Swift** là một ngôn ngữ lập trình hướng đối tượng dành cho việc phát triển iOS và macOS, watchOS, tvOS và z/OS. được giới thiệu bởi Apple tại hội nghị WWDC 2014. Swift được mong
**Đóng gói** (tiếng Anh: _encapsulation_) trong ngôn ngữ lập trình là thuật ngữ dùng để chỉ một trong hai khái niệm khác nhau nhưng có liên quan với nhau, đôi khi còn chỉ sự kết
Trong lập trình hướng đối tượng, **hàm hủy** (tiếng Anh: _destructor_, viết tắt: _dtor_) là một phương thức được gọi tự động để hủy bỏ một đối tượng. Điều này xảy ra khi thời gian
Trong lập trình hướng đối tượng, trong các ngôn ngữ như C++, **hàm ảo** (_virtual function_) hay **phương thức ảo** (_virtual method_) là một hàm hay phương thức có thể thừa kế và ghi đè
Trong điện toán, **lập trình hướng khía cạnh** (tiếng Anh: _aspect-oriented programming_, viết tắt: _AOP_) là một mẫu hình lập trình nhằm tăng tính mô đun bằng cách cho phép phân tách những mối quan
phải|nhỏ|402x402px|[[Mã nguồn của một chương trình máy tính đơn giản được viết bằng ngôn ngữ lập trình C. Khi được biên dịch và chạy, nó sẽ cho kết quả "Hello, world!".]] **Ngôn ngữ lập trình**
**Pascal** là một ngôn ngữ lập trình cho máy tính thuộc dạng mệnh lệnh và thủ tục, được Niklaus Wirth phát triển vào năm 1970. Pascal là ngôn ngữ lập trình đặc biệt thích hợp
**C** là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều
thumb|**[[Phép tính lambda** là một hệ thống hình thức để định nghĩa hàm, ứng dụng hàm và đệ quy được Alonzo Church đề xuất vào những năm 193x.]] **Lý thuyết ngôn ngữ lập trình** (thường
Trong lập trình hướng đối tượng, **lớp** (**class**) là một chương trình-mã-khuôn mẫu có thể mở rộng được để tạo các đối tượng, cung cấp giá trị khởi tạo cho trạng thái (biến thành viên)
**R** là một ngôn ngữ lập trình và môi trường phần mềm dành cho tính toán và đồ họa thống kê. Đây là một bản hiện thực ngôn ngữ lập trình S với ngữ nghĩa
Trong lập trình hướng đối tượng và hàm, **đối tượng bất biến** (tiếng Anh: _immutable object_ hay _unchangeable object_) là một đối tượng mà trạng thái của nó không thể bị thay đổi sau khi
Trong lập trình máy tính, **hàm tạo rỗng** (_nullary constructor_) là một hàm tạo mà không có đối số (_argument_). Nó còn được gọi là **hàm tạo 0 đối số** (_0-argument constructor_). ## Hàm tạo
**Dylan** là một ngôn ngữ lập trình đa mẫu hình có hỗ trợ hàm, lập trình hướng đối tượng (OOP), động và phục hồi trong khi cung cấp một mô hình lập trình được thiết
Đây là danh sách các ngôn ngữ lập trình đáng chú ý, được nhóm theo loại. Vì không có sơ đồ phân loại bao quát cho các ngôn ngữ lập trình, nên trong nhiều trường
**CLU** là một ngôn ngữ lập trình được tạo ra ở Viện Công nghệ Massachusetts (MIT) bởi Barbara Liskov và các sinh viên của bà trong khoảng thời gian từ 1974 đến 1975. Mặc dù
**Object Pascal** chỉ đến một nhánh của phát sinh hướng đối tượng của Pascal, được biết đến chủ yếu với vai trò ngôn ngữ lập trình chính của Delphi. ## Lịch sử ban đầu tại
**OCaml** là dòng ngôn ngữ lập trình phổ dụng trong ngôn ngữ **Caml** (một dạng của ngôn ngữ lập trình ML), bắt đầu được Viện Nghiên cứu Khoa học Máy tính Quốc gia ở Pháp
Trong lập trình hướng đối tượng với lớp, **biến thực thể** (tiếng Anh: _instance variable_) là một biến được định nghĩa trong một lớp (ví dụ một biến thành viên), mà mỗi đối tượng được
**Windows Template Library** (WTL) là thư viện lập trình hướng đối tượng C++ mã nguồn mở dùng để phát triển các ứng dụng trên nền tảng hệ điều hành Windows. WTL được tạo ra bởi
Trong ngành khoa học máy tính, **lập trình hàm** (**lập trình chức năng**) là một mô hình lập trình xem việc tính toán là sự đánh giá các hàm toán học và tránh sử dụng
nhỏ|Cbmain Trong khoa học máy tính, một **ngôn ngữ lập trình bậc cao** (tiếng Anh: _high-level programming language_) là một ngôn ngữ lập trình có sự trừu tượng hóa mạnh mẽ khỏi các chi tiết
thumb|Các vòng lặp lên kế hoạch và phản hồi trong lập trình cực hạn **Lập trình cực hạn** (tiếng Anh: **Extreme programming**, viết tắt là **XP**) là một quy trình phát triển phần mềm nhằm
Trong khoa học máy tính, **chương trình con **(subprogram) hay **subroutine** là một đoạn chương trình được đóng gói thành một đơn vị trình, nó thực hiện một số tác vụ cụ thể mà chương
Trong công nghệ phần mềm và khoa học máy tính, **trừu tượng** (tiếng Anh: **abstraction**) là: * Quá trình loại bỏ hoặc khái quát các chi tiết vật lý, không gian hoặc thời gian hoặc
Trong lập trình máy tính, **hàm tổng quát** (tiếng Anh: _generic function_) là một hàm được định nghĩa cho các kiểu đa hình. ## Trong ngôn ngữ kiểu tĩnh Trong ngôn ngữ kiểu tĩnh (như
nhỏ|Ảnh chụp màn hình tài liệu [[API web viết bởi NASA]] Một **giao diện lập trình ứng dụng** (, viết tắt: _API_) là một giao diện mà một hệ thống máy tính hay ứng dụng
Trong lập trình, **tham số** là biến được thu nhận bởi một chương trình con. Tại thời gian chạy, chương trình con sử dụng các giá trị được gán cho các tham số để thay
**Vim** (; viết tắt của **Vi IMproved**) là một trình soạn thảo văn bản miễn phí và mã nguồn mở. Đó là một bản sao cải tiến của vi của Bill Joy cho Unix. Nó
**Lập trình lượng tử** là quá trình thiết kế hoặc ghép nối các chuỗi lệnh, được gọi là mạch lượng tử, sử dụng các cổng, công tắc và toán tử để điều khiển hệ thống
**C++** (**C Plus Plus**, **CPP,** IPA: /siː pləs pləs/) là một ngôn ngữ lập trình đa năng bậc cao (high-level) được tạo ra bởi Bjarne Stroustrup như một phần mở rộng của ngôn ngữ lập
Trong trí tuệ nhân tạo, **lập trình di truyền** (_genetic programming, GP_) là một kỹ thuật tiến hóa các chương trình mà ban đầu chưa thích nghi (thường là chương trình ngẫu nhiên) cho đến
Trong lập trình máy tính, **Hợp ngữ** (hay **assembly**) thường được viết tắt là **asm** là bất kỳ ngôn ngữ lập trình cấp thấp nào có sự tương ứng rất mạnh giữa các tập lệnh
nhỏ|phải|Biểu tượng hình con thằn lằn đôi khi được các [[lập trình viên dùng trong các chương trình viết bằng ngôn ngữ Lisp.]] **Lisp** là ngôn ngữ lập trình được phát triển từ rất sớm
Trong khoa học máy tính, **reflection** (có thể dịch là "phản tỉnh", "tự xét mình") là việc tiến trình có khả năng xem xét, nội quan, và sửa đổi kết cấu cùng với hành trạng
**Lua** là một ngôn ngữ lập trình thông dịch với đặc điểm nhỏ gọn, đa nền tảng. Lua được phát triển từ C và hệ thống các API theo hướng đơn giản hóa. ## Lịch
Trong lập trình máy tính, **callback** là một đoạn code chạy được (thường là một hàm A) được sử dụng như tham số truyền vào của hàm B nào đó. Hàm A được gọi ngay
**MATLAB** là phần mềm cung cấp môi trường tính toán số và lập trình, do công ty MathWorks thiết kế. MATLAB cho phép tính toán số với ma trận, vẽ đồ thị hàm số hay
**Torch** là một thư viện học máy mã nguồn mở, một framework tính toán khoa học và là một ngôn ngữ kịch bản dựa trên ngôn ngữ lập trình Lua. Nó cung cấp một lượng
phải|Một hàm băm tiêu biểu đang hoạt động **Hàm băm** (tiếng Anh: _hash function_) là giải thuật nhằm sinh ra các **giá trị băm** tương ứng với mỗi **khối dữ liệu** (có thể là một
**Perl** (viết tắt của _Practical Extraction and Report Language_ - ngôn ngữ kết xuất và báo cáo thực dụng) được Larry Wall xây dựng từ năm 1987, với mục đích chính là tạo ra một