我正在阅读 Bjarne Stroustrup 所著的《C++ 编程语言》一书,第二章中的一些代码让我感到困惑。为了这篇文章,我缩短了书中的代码。
以下代码会导致编译错误“使用了 C4700 未初始化的局部变量‘向量’”。
struct Vector
{
int size;
double* elements;
};
void vector_init(Vector vector, int size)
{
vector.elements = new double[size];
vector.size = size;
}
int main()
{
Vector vector;
vector_init(vector, 3);
}
Run Code Online (Sandbox Code Playgroud)
现在这对我来说是有道理的。对我来说没有意义的是,如果我将 Vector 结构作为引用传递,错误就会消失。
struct Vector
{
int size;
double* elements;
};
void vector_init(Vector& vector, int size)
{
vector.elements = new double[size];
vector.size = size;
}
int main()
{
Vector vector;
vector_init(vector, 3);
}
Run Code Online (Sandbox Code Playgroud)
使用此代码作为起点,我已经能够填充向量结构并打印出其值。我无法理解为什么通过引用传递它意味着我现在不再需要初始化结构。
在您的第一个示例中,您的调用将复制的副本vector_init(vector, 3)传递给,但未初始化。由于程序需要读取才能复制它,并且读取未初始化的变量会导致未定义的行为,因此该程序的行为是未定义的。vectorvector_initvectorvector
相反,在第二个示例中,不会从未初始化的变量中读取任何内容。由于vector_init通过引用获取其参数,因此不需要进行复制。 写入未初始化的变量是明确定义的,因此结果是明确定义的程序和 的成员的明确定义的值vector。