这里有抄袭吗?

问题描述 投票:0回答:1

据我了解,您不能从方法返回数组,因为您实际上返回的是指向在方法范围内创建的数据的指针。不能保证数据仍然位于方法范围外该指针指向的地址。

但它似乎适用于构造函数,因为每次运行此代码时都会打印 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]
现在是存储在不同内存地址的两个不同值?还是这些变量共享一个内存位置?

c++ pointers
1个回答
2
投票

函数参数(包括构造函数参数)中的数组类型具有特殊规则,使其在几乎所有用途中都表现得像用指针声明一样。

所以

    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
.

的指针
© www.soinside.com 2019 - 2024. All rights reserved.