Default Constructor

ภูริทัต คมขำ 650710577

Default Constructor ทำหน้าที่เดียวกับ constructor กล่าวคือ ใช้สำหรับกำหนดค่าใน fields ให้กับวัตถุ แต่ Default Constructor แตกต่างออกไป โดยที่ จะไม่รับ parameters ใดๆ ซึ่งจะกำหนดค่าเริ่มต้นให้กับฟิลด์ของวัตถุ

class Person
{
    public string name;
    public int age;
    // Implicit default constructor
}

เห็นได้ว่าคลาส Person ไม่มี constructor ใดๆ เมื่อมีการสร้างวัตถุของ Person ตัว compiler จะกำหนดค่าเริ่มต้นให้ ผลลัพธ์เมื่อสร้างวัตถุ

Person p = new Person();
Console.WriteLine($"Name: {p.name}");     
Console.WriteLine($"Age: {p.age}");
ผลลัพธ์
Name: 
Age: 0

Implicit default constructor

เมื่อไม่มีการประกาศ constructor ใดๆ ในคลาส compiler จะสร้าง default constructor ให้โดยอัตโนมัติดังตัวอย่างก่อนหน้า

Explicit default constructor

เป็นการสร้าง default constructor โดยที่ผู้เขียนกำหนดข้อมูลเริ่มต้นด้วยตัวเอง

class Person
{
    public string name;
    public int age;

    // Explicit default constructor
    public Person()
    {
        name = "_";
        age = 20;
    }

    public static void Main(string[] args)
    {
        Person p = new Person();
        Console.WriteLine($"Name: {p.name}");     
        Console.WriteLine($"Age: {p.age}");
    }
}
ผลลัพธ์
Name: _
Age: 20

เห็นได้ว่าผู้เขียนได้กำหนดค่าเริ่มต้นให้กับ Name = "_", age = 20 ผลลัพธ์ที่ได้ คือ name จะไม่มีค่า null และ age ไม่มีค่า 0 เหมือน Implicit default constructor แล้ว

ค่าเริ่มต้นที่กำหนด

ค่าเริ่มต้นที่กำหนดให้ขึ้นอยู่กับชนิดข้อมูลของฟิลด์แต่ละตัว

  • Numeric เช่น int, float, double, decimal จะถูกกำหนดค่าเริ่มต้นเป็น 0

  • Boolean จะถูกกำหนดเป็น false

  • Character จะถูกกำหนดเป็นค่า null

  • Reference เช่น string, คลาสต่าง ๆ, อาเรย์ จะถูกกำหนดเป็น null

  • Enum ค่าเริ่มต้นจะเป็น สมาชิกตัวแรก

Type
Default value

reference type

null

numeric type

0 (zero)

floating-point numeric type

0 (zero)

bool

false

char

'\0' (U+0000) null character

enum

สมาชิกตัวแรก

struct

สมาชิกแต่ละตัว จะมีค่า default values

class Person
{
    public string name;
    public int age;
    public bool isAlive;
    public char code;
    
    public enum Gender
    {
        Male,
        Female
    }
    
    public static void Main(string[] args)
    {
        Person p = new Person();
        Console.WriteLine($"Name: {p.name}");     
        Console.WriteLine($"Age: {p.age}");        
        Console.WriteLine($"IsAlive: {p.isAlive}");
        Console.WriteLine($"Code: {p.code}");      
        Console.WriteLine($"Gender: {p.gender}"); 
    }
}
ผลลัพธ์
Name:   //null
Age: 0
IsAlive: False
Code:   // null character
Gender: Male

ข้อสำคัญ

ถ้าผู้เขียนใส่ constructor อย่างน้อยหนึ่งอัน compiler จะไม่สร้าง default constructor ให้เสมอไป

class Person
{
    public string name;
    public int age;

    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public static void Main(string[] args)
    {
        Person p = new Person(); // compile-time error
    }
}

ดังนั้นเมื่อมีการประกาศ constructor ใดๆแล้ว ถ้าต้องการประกาศ default constructor จะต้องประกาศด้วยตัวเองเพิ่มลงไป

เปรียบเทียบกับ C,Java,Python

C

เนื่องจากภาษา C เป็น Procedural programming language จึงไม่มี class หรือ object อย่าง OOP (object-oriented programming) และทำให้มีการทั้ง constructor, default constructor ได้ ซึ่งสามารถทำได้ในภาษาอื่นๆของ C-based นั้นคือ C++, C#

Java

ภาษา Java เป็นทั้งภาษาที่สนับสนุน OOP จึงมี default constructor เช่นเดียวกับ C#

class Person{
    public String name;
    public int age;
    public boolean isAlive;
    public char code;
    public Gender gender;
    
    public enum Gender
    {
        Male,
        Female
    }

    public static void main(String[] args)
    {
        Person p = new Person();
        System.out.println("Name : " + p.name);
        System.out.println("Age : " + p.age);
        System.out.println("Alive : " + p.isAlive);
        System.out.println("Code : " + p.code);
        System.out.println("Gender : " + p.gender);
    }
}
ผลลัพธ์
Name : null
Age : 0
Alive : false
Code : 
Gender : null

แต่มีข้อแตกต่างในส่วนค่าเริ่มต้นของ enum ซึ่งใน Java ค่าเริ่มต้น คือ null ส่วนอื่นๆทำงานเช่นเดียวกับ C#

Data Type
Default Value (for fields)

byte

0

short

0

int

0

long

0L

float

0.0f

double

0.0d

char

'\u0000'

String (or any object)

null

boolean

false

Python

Python เป็นภาษาสนับสนุน OOP และ การประกาศตัวแปรไม่จำเป็นต้องระบุชนิดข้อมูล(Dynamic Typing) ซึ่งถ้าไม่ได้มีการกำหนดชนิดข้อมูล ก็จะไม่สามารถกำหนดค่าเริ่มต้นให้ตัวแปรได้ ส่วนใหญ่จะใช้วิธี Explicit default constructor แทน

class Person:
    def __init__(self): # explicit default constructor
        self.name = "Unknown"
        self.age = 20

p = Person()
print(p.name)
print(p.age)
ผลลัพธ์
Unknown
20

ซึ่งแตกต่างที่สามารถกำหนด default constructor ใน parameters ของ constructor ได้เลย

class Person:
    def __init__(self, name="Unknown", age = 20):
        self.name = name
        self.age = age

p = Person()
print(p.name)
print(p.age)
ผลลัพธ์
Unknown
20

และ Python สามารถกำหนดชนิดข้อมูลตอนประกาศตัวแปรได้

class Person:
    name = str()
    age = int()

p = Person()
print(p.name)
print(p.age)
ผลลัพธ์
    #null
0

ผลลัพธ์ที่ได้ คือ compiler กำหนดค่าเริ่มต้นให้เมื่อมีการประกาศชนิดข้อมูลร่วมด้วย

Python default values

  • Numeric Types

    • จำนวนเต็ม int -> 0

    • จำนวนทศนิยม float -> 0.0

    • จำนวนเชิงซ้อน complex -> 0j

  • Sequence Types

    • สตริง str -> null

    • ลิสต์ list -> []

    • tuple -> ()

  • Mapping Type

    • คู่อันดับ dict -> {}

  • Set Types

    • เซ็ต set -> {}

    • เซ็ตที่ไม่สามารถเปลี่ยนแปลงค่าได้ frozenset -> frozenset()

  • Boolean Type

    • ค่าความจริง bool -> false

  • None Type

    • ไม่ระบุชนิดข้อมูล anyVar -> None

Slide

Default Constructor in C#.pdf

Default Constructor in C#.pdf

Video Presentation

Reference :

C#

C

Java

Python

Last updated