Trang chủ » Bài 2 – Hàm dựng trong OOP
Lập trình hướng đối tượng

Bài 2 – Hàm dựng trong OOP

oop

Xin chào mọi người!

Bẵng đi 1 thời gian lười viết blog, thì hôm nay tại hạ tái xuất giang hồ với bài viết mới về chủ đề OOP 😀 mấy ngày nay quả thật là quá lười biếng rồi 🙁 xin lỗi mọi người nhiều.

Trở lại vấn đề, mình có đề cập đến tham số của hàm dựng ở Bài 1 – Mở đầu về lập trình hướng đối tượng. Vậy ngày hôm nay mình sẽ nói kĩ hơn về phần hàm dựng (constructor) nhé!

1. Khái niệm

À ờ… hàm dựng biết nói sao nhỉ? Bản chất nó là 1 phương thức của lớp, nhưng nó sẽ tự động gọi bản thân khi chúng ta khởi tạo 1 đối tượng có nó. Nghe hơi mơ hồ ha, đến với ví dụ này nhé

class MyClass
{
public:
int prop1;
float prop2;
MyClass()
{
cout << "Doi tuong da duoc khoi tao!" << endl;
}
MyClass(int prop1, float prop2)
{
this->prop1 = prop1;
this->prop2 = prop2;
}
};

Các bạn có thấy điều gì lạ không? Trong lớp MyClass lại có 2 phương thức MyClass? Đó chính là hàm dựng đấy. Mình xin rút những lưu ý sau:

  • Khi khởi tạo và cấp phát đối tượng (bằng lệnh new), nó sẽ tự động chạy hàm dựng với các tham số phù hợp.
    MyClass* obj1 = new MyClass();
    // sẽ chạy hàm dựng MyClass() khi khai báo xong
    MyClass* obj2 = new MyClass(10, 5.5f);
    // sẽ chạy hàm dựng MyClass(int prop1, float prop2) khi khai báo xong
    

    Khai báo bao nhiêu lần, nó sẽ chạy bấy nhiêu lần (giả sử ta tạo 1 mảng 5 đối tượng thì nó sẽ chạy hàm dựng 5 lần)

  • Hàm dựng bắt buộc phải có tên trùng với tên lớp
  • Hàm dựng không có kiểu dữ liệu, tất nhiên nó sẽ không có kiểu trả về

Thông thường, mình hay sử dụng hàm dựng để truyền các tham số từ bên ngoài vào và gán chúng cho các thuộc tính.

2. Con trỏ this

Ở ví dụ trên, mình có sử dụng con trỏ this như sau:

MyClass(int prop1, float prop2)
{
this->prop1 = prop1;
this->prop2 = prop2;
}

Mọi người có để ý điều gì lạ không? Trong ví dụ trên, mình lại có 2 biến prop1 và prop2 giống tên nhau. Bản thân tham số truyền vào prop1 và thuộc tính prop1 là 2 biến hoàn toàn khác nhau, tuy nhiên nếu ta ghi:

MyClass(int prop1, float prop2)
{
prop1 = prop1;
prop2 = prop2;
}

prop1 nào là tham số truyền vào, prop1 nào là thuộc tính?

Lúc này ta sử dụng con trỏ this, bản thân con trỏ this chính là đại diện cho chính lớp đó, và chỉ có tác dụng trong lớp đó thôi (sang lớp khác thì nó thành “hàng” của lớp khác rồi nhé :D). Nó có thể trỏ tới bất kỳ thuộc tính, phương thức nào của lớp (tuy nhiên các thành viên tĩnh static lại không được nhé, mình sẽ giải thích ở bài sau). Ở ví dụ trên, mình đã chỉ rõ this->prop1 để phân biệt với tham số truyền vào prop1.

Có con trỏ this rất tiện lợi. Bạn có thể đặt tên các tham số truyền vào trùng với tên thuộc tính, để làm cho các lập trình viên dễ kiểm soát code của mình (một số lập trình viên thích sử dụng những cách đặt tên khác như có dấu gạch chân “_” ở đầu tên tham số,… nhưng mình vẫn thích cách này :D).

Trên đây là bài viết về Hàm dựng trong OOP. Cảm ơn các bạn đã quan tâm theo dõi! Hẹn gặp lại trong những bài tiếp theo nhé!

Tags

About the author

Võ Hoài Sơn

Tính tình bất định
Chọc vào là bịnh
Rất yêu lập trình
Luôn code hết mình
Mình hiện đang là sinh viên của trường ĐH Khoa học tự nhiên TPHCM. Bản thân rất thích code, kiêm luôn cả mần thơ nên thường hơi hâm hâm dở dở. Ngoài ra chém gió, chém chuối, chém trái cây các kiểu cũng là sở trường của mình. Rất mong được làm quen với các bạn :D

Add Comment