构造器
在类别基础的面向对象程序设计中，构造器（英语： Constructor，有時簡稱 ctor），别称：构造方法、构造函数、建构子、建構式）是一个-{zh-hans:类;zh-hant:類別;}--{zh-hans:里;zh-hant:裡}-用于建立对象的特殊子程序。它能初始化一个新建的对象，并时常会接受参数用以设定变量。
构造器跟一般的实例方法十分相似；但是与其它方法不同，构造器没有，不会被继承，且不会有范围修饰符。构造器的函数名称一般与它所属的-{zh-hans:类;zh-hant:類別;}-的名称相同。 它承担着初始化对象数据成员并建立类不变象的任务；在-{zh-hans:类;zh-hant:類別;}-不变象无效的时候它会失败。一个正确编写的构造器会使它生成的对象保持在一个"有效"状态。不可变物件必须在构造器内完成所有初始化。
多数编程语言允许构造器重载 - 一个-{zh-hans:类;zh-hant:類別;}-被允许拥有多个接受不同种类的构造器同时存在。一些编程语言允许某些特殊种类的构造器。使用单个-{zh-hans:类;zh-hant:類別;}-来具体地建立和返回新实例的构造器，时常被抽象为工厂方法 - 一种同样用来建立新对象，但会同时使用多个-{zh-hans:类;zh-hant:類別;}-，或者一些诸如对象池的分配方案来完成这一过程的子程序。
接收参数的构造器被称为参数化构造器。参数的数量可以大于或等于一。例如，在C++中： class Example Example :: Example() Example :: Example(int a, int b) 使用参数化构造器声明对象时，必须传入初始值作为构造器的参数。在这种情况下，一般的声明对象的方法可能不再适用。
构造器函数的调用方式可以分为显式和隐式两种。
如果在编写一个可实例化的类时没有专门编写构造器，多数编程语言会自动生成缺省构造器。
缺省构造器的特性依不同语言而定。某些情况下它会将所有的实例变量同时初始化到0，或者任何其他别的值；某些缺省构造器什么也不会做。
某些语言 (Java, C#, VB .NET) 会缺省构造由该类类型定义的数组，使其充满空值引用。没有空值引用的语言一般会禁止缺省构造包含不可缺省构造对象的数组，或者要求在建立时专门初始化这些数值 (C++):
class student{
int main() { 轉換建構子可定義從使用者定義或內建類型轉換成使用者定義類型的作業。 複製建構子（英語：Copy constructor）是C++程式語言中的一種特別的建構子，習慣上用來建立一個全新的物件，這個全新的物件相當於已存在物件的副本。這個建構子只有一個參數（引數）：就是用來複製物件的參照（常用const修飾）。建構子也可以有更多的參數，但除了最左第一個參數是該類別的參照類別型外，其它參數必須有預設值。 移动构造函数（英语：Move constructor）是 C++11 中新增的一种构造函数，用来避免多余的分配新内存——复制——销毁旧内存的操作。参见 C++11 条目内的介绍。
在 Java, C# 和 VB .NET -{zh-hant:裡;zh-hans:里;}-，构造器会在一种叫做-{zh-cn:堆;zh-tw:堆積}-的特殊数据结构里建立作为引用类型的实例。數值类型（例如 int, double 等等）则会建立在叫做-{zh-cn:栈;zh-tw:堆疊}-的有序数据结构-{zh-hant:裡;zh-hans:里;}-。VB .NET and C# 会允许用 "new" 来建立值类型的实例。然而在这些语言-{zh-hant:裡;zh-hans:里;}，即使使用这种方法建立的对象依然只会在栈-{zh-hant:裡;zh-hans:里;}-。
在 C++ -{zh-hant:裡;zh-hans:里;}-，不用 new 建立的对象会保存在栈-{zh-hant:裡;zh-hans:里;}-，使用 new 建立时则会在-{zh-cn:堆;zh-tw:堆積}--{zh-hant:裡;zh-hans:里;}。它们必须分别使用析构函数或者 delete 操作才能被删除。
在Java里，构造器和其他方法的主要差别在于： Java 里的构造器会按照以下顺序完成下列工作： 在 Java 中可以通过关键词 codice_21 访问父类的构造器。 public class Example
// Code somewhere else // Instantiating an object with the above constructor Example e = new Example(42); 不接收任何参数的构造器被称作“无参数构造器”。
在Visual Basic .NET中, 建構子以"codice_3"為定義方法，并且必须是个 Sub。 Class Foobar
End Class
' code somewhere else ' instantiating an object with the above constructor Dim foo As New Foobar(".NET")
public class MyClass
// Code somewhere // Instantiating an object with the constructor above MyClass c = new MyClass(42, "string"); 在C#中,"靜態建構子"是用來初始化任何靜態資料。静态构造函数也称为“类构造函数”，由于类构造函数在生成的 MSIL 里名为“.cctor”，因此也被称为“cctor”。
静态构造函数允许复杂的静态变量初始化。 静态构造函数在该类第一次被访问时调用，任何使用该类的操作（无论是调用静态函数、属性还是访问静态变量，还是构造类的实例）都会引发静态构造函数的执行。静态构造函数是线程安全的，并且是单例的。当用在泛型类中时，静态构造函数对于泛型的每个实例化都调用一次。静态变量也同样如此。 public class MyClass
// Code somewhere // Instantiating an object with the constructor above // right before the instantiation // The variable static constructor is executed and _A is 32 MyClass c = new MyClass(); C++ 的构造函数以该-{zh-cn:类;zh-tw:類別}-的名稱为标识，且不須写-{zh-cn:返回值类型;zh-tw:回傳值型別;}-也无法-{zh-cn:返回值;zh-tw:回傳數值}-：
class C{ public:
构造函数的函数体执行是在各个成员构造完之后才开始，因此要想更改成员的-{zh-tw:建構;zh-cn:构造;}--{zh-cn:方式;zh-tw:方法}-需要使用成员初始化列表：
class B{ public:
基类的方式与成员相同，是在初始化列表中写基类名、接构造函数参数表：
class D: public B{ public:
复制构造函数接受同类对象的左值引用（一般为 const T &）、移动构造函数接受右值引用（一般为 T&&）：
class E{ public:
C++ 中，程序员若未对某类定义构造函数（以及赋值函数、析构函数），编译器在满足条件时会定义相应的函数，参见 等页面。
component initmethod="Cheese" {
program OopProgram;
type
constructor TPerson.Create(AName: string); begin end;
var begin end.
package Person; sub new {
1;
package Person; use Moose;
has first_name => (is => 'ro', isa => 'Str', required => 1); has last_name => (is => 'ro', isa => 'Str', required => 1); has age => (is => 'rw', isa => 'Int', predicate => 'has_age');
sub BUILD { 1;
class Person
»> class ExampleClass(object): ... def __new__(cls, value): ... print("Creating new instance...") ... # Call the superclass constructor to create the instance. ... instance = super(ExampleClass, cls).__new__(cls) ... return instance ... def __init__(self, value): ... print("Initialising instance...") ... self.payload = value »> exampleInstance = ExampleClass(42) Creating new instance... Initialising instance... »> print(exampleInstance.payload) 42
irb(main):001:0> class ExampleClass irb(main):002:1> def initialize irb(main):003:2> puts "Hello there" irb(main):004:2> end irb(main):005:1> end => nil irb(main):006:0> ExampleClass.new Hello there => #