Mình có vài câu hỏi về constructor, overload operator trong C++. Mong các bạn xác minh là mình hiểu đúng không. Những cái này mình ghi trong comment bên cạnh code nha.
Vấn đề 1: mình hiểu mấy cái này đúng không?
Vect() // cái này là default constructor
{};
Vect( const Vect &t) //constructor được gọi khi truyền vào 1 object Vect
{}
Vect &operator = (const Vect &tmp)// overload assignment operator
{}
~Vect() //destructor
{}
//cái bên dưới là constructor được gọi khi nhận tham số truyền vào kiểu primitive type
Vect( const float tx, const float ty, const float tz, const float tw )
{}
//overload cái + operator. Trả về một vector sau khi cộng. Cái này dùng để tạo một object mới nên return là Vect.
Vect operator + (const Vect &t) const
{
return Vect(this->x + t.x, this->y + t.y, this->z + t.z, this->w + t.w);
}
//cũng là cộng vector nhưng là để update data trong Object Vector hiện tại. Vì chỉ update data trong object vector hiện tại nên return là *this;
Vect & operator += (const Vect4D &t)
{
this->x += t.x;
this->y += t.y;
this->z += t.z;
this->w += t.w;
return *this;
}
Vấn đề thứ 2 là từ khóa const
. Giả sử mình có 1 class mà data được set private và mình viết setter như sau:
float getA() const
float getA()
Hai cái trên khác nhau chỗ nào vậy? Theo mình biết thì khi mình viết const ở cuối function, những data của object sẽ không được thay đổi trong quá trình viết định nghĩa cho hàm. Ví dụ:
class abc {
private:
int a;
public:
float asb() const {
a++;
return a;
}
};
Nếu làm như trên thì không được. Nó sẽ báo lỗi không cộng a lên 1 đơn vị được.
Nhưng bên trên là getter thôi thì tại sao phải có lúc phải const, lúc không.
Nếu mình chỉ viết hàm bình thường thì có nên viết const phía cuối hàm không?
Vấn đề cuối là overloading operator:
Vect operator + (const Vect &t) const
Vect & operator += (const Vect &t)
Sao 2 cái trên mình để ý là 1 cái dùng reference nhưng không có const phía sau, 1 cái có const nhưng không dùng reference. Nó khác nhau như thế nào vậy?