据我了解,您不能从方法返回数组,因为您实际上返回的是指向在方法范围内创建的数据的指针。不能保证数据仍然位于方法范围外该指针指向的地址。
但它似乎适用于构造函数,因为每次运行此代码时都会打印 true。我只是走运吗?
class Vector3d {
public:
float* data_ptr;
public:
Vector3d(float values[3]) {
data_ptr = values;
}
};
int main(){
float arr[] = {3, 4, 5};
Vector3d vec = Vector3d(arr);
cout << (vec.data_ptr[0] == arr[0]) << endl;
}
我认为我的另一个选择是使成员变量成为数组而不是指针并使用“复制”构造函数:
class Vector3d {
public:
float data_ptr[3];
public:
Vector3d(float values[3]) {
for (int i = 0; i < 3; i++) {
data_ptr[i] = values[i];
}
}
};
这是否意味着
data_ptr[i]
和 values[i]
现在是存储在不同内存地址的两个不同值?还是这些变量共享一个内存位置?
函数参数(包括构造函数参数)中的数组类型具有特殊规则,使其在几乎所有用途中都表现得像用指针声明一样。
所以
Vector3d(float values[3])
其实是
Vector3d(float* values)
因此,在第一个代码段中,您只是将指向
arr
的指针值从 main
存储到 data_ptr
中。 arr
在main
生活到main
结束。所以你仍然可以访问它。当您访问data_ptr[i]
时,您实际上正在访问arr[i]
.
在此代码中没有复制数组。你只是在操纵指针。如果您希望数组具有与其他类型一样的复制行为,请使用
std::array
而不是内置数组。 std::array
的行为类似于任何标量或类类型,而内置数组具有从 C 继承的奇怪行为。
在第二个片段中,您明确地将
arr
中的元素复制到新数组data_ptr
中。 data_ptr
数组与 arr
数组不同,因为它们的生命周期重叠,所以它们必须位于不同的地址。我上面所说的仍然适用:values
只是指向arr
. 的指针