Hỏi về toán tử new trong C++

Cho em hỏi, khi em cấp phát động cho con trỏ như thế này.

class hocsinh {}
hocsinh *x = new hocsinh;

Em chưa hiểu cú pháp này lắm cho ạ.
hocsinh *x có phải được hiểu là con trỏ x có kiểu là class hocsinh không ạ?,Còn hocsinh đứng sau new được hiểu là gì vậy ạ

Tại sao người ta không để cú pháp là hocsinh new *x; để con trỏ x được hiểu là vừa được cấp phát động vừa có kiểu dữ liệu là hocsinh ạ?
Em chưa hiểu công dụng của hocsinh đứng sau new lắm ạ

Đây là do người thiết kế ngôn ngữ người ta chỉ định và được người dùng đồng thuận như vậy.

HocSinh đứng sau new để biết rằng nó đang tạo ra instance bằng cách gọi constructor HocSinh(). Để phân biệt với nhiều kiểu khác.

HocSinh *x = new HocSinhNguoiViet;
HocSinh *x = new HocSinhNguoiLao;
HocSinh *x = new HocSinhGioi;
HocSinh *x = new ConThayGiao;
2 Likes

Em chưa hiểu lắm ạ, bản chất giữa cấp phát động kiểu int và như anh nói có giống nhau không ạ

int *x = new int;
hocsinh *x = new hocsinhnguoiviet;

bản chất thì 2 thằng này khác nhau ạ?

Bản chất cả hai đều là như nhau - cấp phát động vào bộ nhớ heap và gán vào con trỏ - chỉ là instance khác nhau một cái là int một cái là hocsinhnguoiviet kế thừa từ hocsinh thôi
Đọc thêm về toán tử new tại cppreference

Nhưng tại sao con trỏ có kiểu hocsinh mà mình lại có thể gán địa chỉ của đối tượng hocsinhnguoiviet được cấp phát ạ.
Em xem trên ytb mà người ta ko nói rõ về vấn đề này, chỉ nói là để truy cập phương thức của hàm con thông qua hàm cha ( tính chất đa hình ). Chứ ngta không nói tại sao lại gán địa chỉ cho con trỏ.
Ví dụ:

class A {
public : virtual nhap();
};
class B : public A {
public : nhap();
};
A *x = new B;
x->nhap(); 

Việc gán địa chỉ của đối tượng có kiểu B cho con trỏ A có tác dụng gì vậy ạ, máy tính sẽ hiểu câu lệnh này như thế nào ạ?

Cái đấy là mình nhầm :)))) nó sẽ trả về một con trỏ mới có kiểu dữ liệu mình lấy chứ không phải là địa chỉ
Còn về tính đa hình thì hocsinh có thể đại diện cho cả hocsinh, hocsinhnguoiviet và các lớp khác kế thừa từ lớp cha nên có thể gán về con trỏ đó

em chưa hiểu lắm ạ, cứ thấy mơ hồ sao sao á a

nhưng nếu nó trả về con trỏ thì tại sao khi em viết code như thế này nó lại xuất ra màn hình một địa chỉ được ạ?

hocsinh *x = new hocsinh;
cout << x;

Vì con trỏ chứa địa chỉ. cout << *x sẽ báo lỗi vì ko có hàm này.

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