Tìm hiểu cách sử dụng new Class() và new Class[]()

Chào mọi người,

Hiện tại mình đang học thêm về cách sử dụng mảng động và danh sách liên kết, nên có nhiều chỗ vẫn chưa thật sự hiểu rõ, mong mọi người giải thích. Mình có viết đoạn code như sau:

#include <iostream>
#include <vector>
using namespace std;
struct Node{
    public:
    int data;
    Node *next;
};
int main()
{
    int n = 10;
    Node *node = new Node[n]();
    for (int i = 0; i < n; i++){
        node[i].data = i+1;
        node[i].next = (&node[i+1]);
        if (i == n-1){node[i].next = nullptr;}
    }
    while (node != nullptr){
        cout << "data: " << node -> data << endl;
        node = node -> next;
    }
    return 0;
}

Mình có một thắc mắc, đó là nếu như mình viết thế này :

Node *node = new Node();
node -> data = 1; 

thì code sẽ chạy được , do node là pointer nên cần dùng dấu " -> " để gọi thành viên của lớp Node. Chỗ này thì mình hiểu. Nhưng khi mình viết đoạn code như thế này :

Node *node = new Node[n]();
for (int i = 0; i < n; i++){
node[i].data = i+1;
node[i].next = (&node[i+1]);
if (i == n-1){node[i].next = nullptr;}
} 

thì khi đó mình phải dùng dấu “.” mới gọi được các thành viên trong nhóm.

Tại sao chỗ này bắt buộc phải sử dụng dấu “.” thì mới có thể gọi các thành viên trong lớp đó ra ? Nếu được mong mọi người giải thích giúp mình Node *node = new Node[n]() hoạt động thế nào ?

Mình xin cảm ơn.

p-> là cách viết tắt của (*p). thôi

pp + 0 nên *p*(p + 0), mà p[i] là viết tắt của *(p + i), nên *(p + 0)p[0], vậy p[0].*(p + 0).*(p).p-> thôi. Tương tự p[i]*(p + i).

node->data có thể viết là node[0].data thôi :V


Node *node = new Node[n]() thì nó làm 2 việc:

  • Cấp phát n * sizeof(Node) bytes
  • Value-initialized n đối tượng thuộc class Node (ở đây vì int và pointer ko có ctor nên value-initialize nó zero-initialize data và next = 0 hết cho n đối tượng được cấp phát)

bỏ dấu ngoặc () đi cũng được, Node* node = new Node[n] là đủ rồi nếu ngay sau đó gán data và next cho từng đối tượng :V

2 Likes

Cảm ơn câu trả lời của bạn, rất chi tiết và dễ hiểu :smiling_face_with_three_hearts:

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