Hàm thiết lập trong c++

Trong hầu hết các thuật giải, để giải quyết một vấn đề thường phải thực hiện các công việc:
Khởi tạo giá trị cho biến, cấp phát vùng bộ nhớ của biến con trỏ, mở tập tin để truy cập,…
Hoặc khi kết thúc, chúng ta phải thực hiện quá trình ngược lại như: Thu hồi vùng bộ nhớ đã cấp phát, đóng tập tin,…
Các ngôn ngữ OOP có các phương thức để thực hiện công việc này một cách “tự động” gọi là phương thức thiết lập và phương thức hủy bỏ.

Constructor 

là một loại phương thức đặc biệt dùng để khởi tạo thể hiện của lớp.
Bất kỳ một đối tượng nào được khai báo đều phải sử dụng một hàm thiết lập để khởi tạo các giá trị thành phần của đối tượng.
Hàm thiết lập được khai báo giống như một phương thức với tên phương thức trùng với tên lớp và không có giá trị trả về (kể cả void).
Constructor phải có thuộc tính public
Constructor có thể được khai báo chồng như các hàm C++ thông thường khác hay không?
Constructor có thể được khai báo với các tham số có giá trị ngầm định hay không?
câu trả lời là có:

Ví dụ
class point{
  /*Khai báo các thành phần dữ liệu*/
 int x, y;
public:
  point() { x = 0; y = 0; }  /*Hàm thiết lập mặc định*/
  point(int ox, int oy) { x = ox; y = oy; }/*Hàm thiết lập*/
  void move (int dx, int dy);
  void display();
};
point a(5,2);
point b;
point c(3); 

Ví dụ
class point{
  /*Khai báo các thành phần dữ liệu*/
 int x, y;
public:
  point() { x = 0; y = 0; }  /*Hàm thiết lập mặc định*/
  point(int ox, int oy = 1){ x = ox; y = oy;}/*Hàm thiết lập*/
  void move (int dx, int dy);
  void display();
};
point a(5,2);
point b;
point c(3);

Constructor mặc định

Constructor mặc định (default constructor) là constructor được gọi khi thể hiện được khai báo mà không có đối số nào được cung cấp
MyClass x;
MyClass* p = new MyClass;
Ngược lại, nếu tham số được cung cấp tại khai báo thể hiện, trình biên dịch sẽ gọi constructor khác (overload)
MyClass x(5);
MyClass* p = new MyClass(5);
Đối với constructor mặc định, nếu ta không cung cấp bất kỳ constructor nào, C++ sẽ tự sinh constructor mặc định là một phương thức rỗng.
Tuy nhiên, nếu ta không định nghĩa constructor mặc định nhưng lại có các constructor khác, trình biên dịch sẽ báo lỗi không tìm thấy constructor mặc định nếu ta không cung cấp tham số khi tạo thể hiện.

Ví dụ
class point{
  /*Khai báo các thành phần dữ liệu*/
 int x, y;
public:
  point(int ox, int oy = 1){ x = ox; y = oy;}
  void move (int dx, int dy);
  void display();
};
point a(5,2);
point b;
point c(3);

Copy constructor

Chúng ta có thể tạo đối tượng mới giống đối tượng cũ một số đặc điểm, không phải hoàn toàn như phép gán bình thường, hình thức “giống nhau” được định nghĩa theo quan niệm của người lập trình. Để làm được vấn đề này, trong các ngôn ngữ OOP cho phép ta xây dựng phương thức thiết lập sao chép.
Đây là phương thức thiết lập có tham số là tham chiếu đến đối tượng thuộc chính lớp này.
Trong phương thức thiết lập sao chép có thể ta chỉ sử dụng một số thành phần nào đó của đối tượng ta tham chiếu “gần giống nhau”

Hàm hủy bỏ – Destructor

Destructor, được gọi ngay trước khi một đối tượng bị thu hồi.
Destructor thường được dùng để thực hiện việc dọn dẹp cần thiết trước khi một đối tượng bị hủy.
Một lớp chỉ có duy nhất một Destructor
Phương thức Destructor trùng tên với tên lớp nhưng có dấu ~ đặt trước
Được tự động gọi thực hiện khi đối tượng hết phạm vi sử dụng.
Destructor phải có thuộc tính public

Ví dụ
class vector{
int n;  //số chiều
float *v;   //vùng nhớ tọa độ
public:
vector(); //Hàm thiết lập không tham số
vector(int size); //Hàm thiết lập một tham số
vector(int size, float *a);
~vector();//Hàm hủy bỏ, luôn luôn không có tham số
void display();
};