Thắc mắc về cách tạo constructor

class Person{
	protected:
		string firstName;
		string lastName;
		int id;
	public:
		Person(string firstName, string lastName, int identification){
			this->firstName = firstName;
			this->lastName = lastName;
			this->id = identification;
		}
		void printPerson(){
			cout<< "Name: "<< lastName << ", "<< firstName <<"\nID: "<< id << "\n";
		}

};
class Student :  public Person{
	private:
		vector<int> testScores;
	public:
	   Student(string firstName_, string lastName_, int identification_, vector<int> testScores_):Person(firstName_, lastName_, identification_){
	       this->testScores = testScores_;
       }

chỗ Student(string firstName_, string lastName_, int identification_, vector<int> testScores_):Person(firstName_, lastName_, identification_) sẽ hiểu như thế nào và có cách viết khác thay thế hay không?

Đây là danh sách khởi tạo. Vì khi một đối tượng của class Student được khai báo thì 1 đối tượng của class Person được tạo ra trước, sau đó đối tượng của class Student tạo ra sau (cha được tạo ra trước, con được tạo ra sau, destructor thì ngược lại).
Giả sử trong các thuộc tính của class Person có 1 biến là hằng số (const int a) hoặc tham biến (ví dụ int &x) thì nó phải được khởi tạo giá trị khi khai báo.
Nhưng do cơ chế cha tạo ra trước, con tạo ra sau nên người ta dùng danh sách khởi tạo như vậy có chức năng khởi tạo giá trị cho các thuộc tính của class cha.

3 Likes

Cú pháp này dùng để kích hoạt constructor của superclass và/hoặc các thành phần trước rồi mới vào constructor cho class này.

Sử dụng toán tử gán rất bất lợi vì không có cái gọi là super(), phải khởi tạo hai lần trong khi tham chiếu chỉ bind được một lần duy nhất và toán tử gán có thể rất nặng nề hay không tồn tại :smiley:

Primitive vẫn có constructor :smiley:

class Fraction {
   int num_, denom_;
   public:
      Fraction() : num_(0), denom_(1) {};
      Fraction(int num, int denom) : num_(num);
};
3 Likes

vậy không cón cách khởi tạo constructor lớp cha khác ngoài phải dùng " : " sao?

Đó là cách duy nhất :smiley:

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?