C++链表节点构造函数未正确设置默认值问题咨询
问题分析与解决
这其实是个很容易踩的C++构造函数误区,我来给你拆解清楚:
核心原因:构造函数声明≠自动完成成员赋值
你第一种写法只是声明了带默认参数的构造函数,但没有编写将参数赋值给成员变量的逻辑。C++编译器不会因为你声明了带参数的构造函数,就自动帮你把参数值(包括默认的nullptr)赋值给对应的成员变量next和prev。
如果你的构造函数只有声明、没有实现函数体,要么链接阶段会报错(找不到函数实现);如果是你写了空函数体的定义,那成员变量next和prev会处于未初始化状态,值是随机的垃圾数据,自然不会是nullptr。
而第二种写法里,你明确在函数体中写了:
val = d; next = n; prev = p;
这就把参数(包括默认的nullptr)的数值赋值给了成员变量,所以next和prev才会被正确设置。
更优的写法:成员初始化列表
在C++中,更推荐用成员初始化列表来完成成员变量的初始化,比函数体里赋值更高效(尤其是针对非基本类型成员),写法如下:
node_t(double d, node_t *n = nullptr, node_t *p = nullptr) : val(d), next(n), prev(p) {}
这种方式直接在构造函数初始化阶段就给成员变量赋值,避免了先默认初始化再赋值的额外开销。
补充:默认参数的位置注意点
如果构造函数的声明和定义分离(比如声明在头文件,定义在.cpp文件),默认参数只需要在声明中指定,定义里不能重复写默认参数,否则会编译错误。示例如下:
// 头文件(声明) class node_t { public: node_t(double value, node_t * next = nullptr, node_t * prev = nullptr); }; // .cpp文件(定义) node_t::node_t(double value, node_t * next, node_t * prev) : val(value), next(next), prev(prev) {}
内容的提问来源于stack exchange,提问作者mrmagin
相关产品推荐
相关产品推荐

