30/09/2018, 20:55

Sự khác nhau giữa một pointer và một object trong OOP C++

Mọi người giúp Em phân biệt một Pointer và một Object trong lập trình hướng đối tượng c++ với ạ. E đang bị rối.
Ví dụ:

Class A{
};
int main(){

A *a1 = new A();
A a2;
}

a1 và a2 khác nhau gì ạ.

Tao Không Ngu. viết 23:11 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Phương Trọng Lê viết 23:10 ngày 30/09/2018

Có thể phân biệt đơn giản như sau:

  • Liên quan phép gán: khi thực hiện phép gán thì a1 sẽ trỏ tới vùng nhớ mới mà được gán cho nó, còn a2 thì mình lấy ví dụ sau có class SinhVien{int diem, int mssv}; SinhVien sv1, sv2. Câu lệnh sv1 = sv2 sẽ thực hiện ngầm như sau sv1.diem = sv2.diem, sv1.mssv = sv2.mssv
  • Kích thước: bản thân a1 chỉ là con trỏ nên kích thước của nó thường là 8 hoặc 4 byte, còn kích thước của a2 là tổng kích thước của các thuốc tính cấu thành nên nó
  • Trong oop,: nếu dùng a2 thì k sử dụng dc tính đa hình, bản thân a2 khi được khai báo là sẽ tự động gọi construtor mặc định của nó và sẽ tự động gọi destructor khi hàm chứa nó kết thúc, còn a1 thì tất cả đều đó phải thực hiện thủ công
Lê Nguyễn Hoài An viết 22:58 ngày 30/09/2018

ủa như vậy chưa đủ bạn biết đâu là con trỏ đâu là obj à

Tao Không Ngu. viết 23:06 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Lê Nguyễn Hoài An viết 23:00 ngày 30/09/2018

Em nghĩ có khi nào nó liên quan tới stack và heap k ạ. vì Em nhớ là một biến khi được new thì vùng địa chỉ giá trị được lưu trong heap còn những biến kk new sẽ nằm ở stack ??? k biết có đúng không

Lê Nguyễn Hoài An viết 23:09 ngày 30/09/2018

mình chỉ muốn tìm hiểu sâu hơn thôi chứ không có gì.

Maskma viết 23:06 ngày 30/09/2018

Đúng rồi, dùng con trỏ khi new nó sẽ khởi tạo bộ nhớ trong vùng heap.
Khi sử dụng con trỏ new thì phải nhớ delete trước khi con trỏ trỏ đến vùng nhớ khác/con trỏ ra khỏi scope(phạm vị được con trỏ được khai báo)/khi new lần nữa nếu ko sẽ bị memory leak.
Để tránh memory leak thì hoặc là ng lập trình phải lập trình cẩn thận hoặc là như những ngôn ngữ như c#, java nó sẽ dọn cho mình nếu ko còn dùng nữa. Tuy nhiên nhiều lúc nó không dọn hết.
Nhưng trong C ko có cái chức năng garbage collection (GC) trên nên ta phải dọn tay hay dùng smart pointer để dọn hộ. Bh thì khuyên dùng smart pointer vì khi sử dụng con trỏ con rất nhiều thứ phức tạp mà trong khi làm ta không thể tự tay dọn phần memory đã cấp phát vì ko biết lúc nào nó thực sự dùng xong.
Bạn hãy đọc thêm về smart pọinter và memory leak để biết ưu nhược điểm của chúng. Rất hữu ích đấy!

Tao Không Ngu. viết 23:11 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Lê Nguyễn Hoài An viết 23:07 ngày 30/09/2018

vậy a và b khác gì nhau ?

Lê Nguyễn Hoài An viết 22:56 ngày 30/09/2018

cái đó Em có biết sơ sơ mà để phân biệt pointer và object thì ngoại trừ lưu trữ ra thì Em tịt.

Lê Nguyễn Hoài An viết 23:08 ngày 30/09/2018

Poiter cấp phát trong help va được giải phóng khi goi.
Viết đúng giúp Em ạ. Điều Em muốn biết là pointer và object nó khác gì nhau. ngoại trừ cách nó lưu xuống bộ nhwos thì còn gì nữa không ạ. ?

Maskma viết 23:04 ngày 30/09/2018

a và b khác ở điểm này:
int *a = new int thục hiện 2 việc. 1 là khai báo 1 con trỏ int tên a. Nó sẽ chiếm 1 vùng nhớ 4->8bytes ở stack. 2 là cấp phát 1 vùng nhớ có kích thước = 2 byte ( =sizeof integer) trong heap và để a trỏ vào đầu vùng nhớ mới câp phát.
int b thì khai báo 1 biến int tên b có kích thước 2 byte trong stack

Tao Không Ngu. viết 23:05 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Maskma viết 23:06 ngày 30/09/2018

Pointer là để chỉ trỏ vào 1 vùng nhớ.
Khi tạo 1 một object thực ra nó chỉ là tạo 1 vùng nhớ có kích thước lớn hơn hoặc bằng tổng kích thước các thuộc tính của class đó.
Pointer chỉ vào object thực ra là chỉ vào đầu vùng nhớ của object nhưng nó biết object lớn cỡ nào nên biết từ chỗ nó trỏ đến bao nhiêu byte nữa thì đó là vùng nhớ của object

Lê Nguyễn Hoài An viết 23:07 ngày 30/09/2018

viết tiêu đề hơi nhầm

Lê Nguyễn Hoài An viết 22:57 ngày 30/09/2018

vậy giá trị của một object trong C++ là gì ạ ?

Tao Không Ngu. viết 23:10 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Lê Đại Tú viết 23:06 ngày 30/09/2018

Hiện tại mình có biết được 2 cái đó là:

  1. Cách lưu trữ một pointer và một object
  2. Khi Bạn cần gọi phương thức đa hình thì pointer làm được điều đó còn object thì không.

Tài liệu đọc thêm : http://stackoverflow.com/questions/5372707/in-c-whats-the-difference-between-an-object-and-a-pointer-to-an-object

Ha Gia Phat viết 23:03 ngày 30/09/2018

Pointer lưu địa chỉ tới Object. Bạn có thể tưởng tượng 1 instance của Object là 1 cái hộp có chứa data, có 1 mũi tên lúc nào cũng chỉ đến cái hộp đó, mũi tên đó là Pointer

Bài liên quan
0