c++定义链表节点:
// 定义链表节点结构体
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){}
};
程序来自代码随想录 ,使用了结构体定义了链表节点,其中程序第四行是结构体的构造函数,这个在以前的学习中没看到过,所以又去查询了结构体构造函数的相关知识,
结构体的默认构造函数是编译器自动生成的无参构造函数,它的主要作用是初始化结构体的成员变量。
默认构造函数通常情况下是不可见(private)的。例如,以下代码定义了一个结构体 student,但没有显式地定义默认构造函数:
struct student {
int id;
char gender;
};
在这个例子中,编译器会自动为 student 结构体生成一个无参的默认构造函数,该函数会将结构体中的所有成员变量都初始化为对应类型的默认值(例如,int 类型的成员变量 id 会被初始化为 0,char 类型的成员变量 gender 会被初始化为空字符 ‘\0’)。
如果我们在定义结构体时显式地定义了默认构造函数,编译器就不会自动生成默认构造函数了。例如:
struct student {
int id;
char gender;
student() {} // 显式定义的默认构造函数
};
在这个例子中,我们显式地定义了一个无参的默认构造函数,它的函数体为空。由于我们已经提供了一个自定义的构造函数,编译器就不会再生成默认的构造函数了。
需要注意的是,如果结构体中包含其他的构造函数,包括带参数的构造函数、复制构造函数等等,编译器也会根据需要自动生成相应的构造函数。例如,以下代码中我们定义了一个带有参数的构造函数和一个复制构造函数:
struct student {
int id;
char gender;
student(int i, char g): id(i), gender(g) {} // 带参数的构造函数
student(const student& other): id(other.id), gender(other.gender) {} // 复制构造函数
};
在这个例子中,编译器会自动生成默认构造函数,和一个无参的拷贝构造函数(因为我们没有显式地定义过拷贝构造函数)。
目前对复制构造函数和拷贝构造函数等等还不是很懂,继续深入了解吧!
最后说一句,上述节点的产生是这样的:
dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点