-1

我对它们在 C++ 中的存在感到非常困惑。问题是它们是部分实现的(至少在 VC++ 2013 中)。例如,您不能将动态分配的内存数组分配给数组对象:

int pArray[] = new int[2];

带有错误代码:

cmd_c++_test___.cpp(88): error C2440: 'initializing' : cannot convert from 'int *' to 'int []' 1> 没有对数组类型的转换,虽然有对数组的引用或指针的转换

但是如果你将一个'int *'传递给一个参数类型为'int []'的函数,这将是合法的:

    void Func(int a1 [])
    {
        return;
    }

//Somewhere in main()

        int *pArray = new int[2];

        Func(pArray);

你也不能返回数组:

int (FuncAn(int a1[]))[]
{
    return;
}

出现错误:

cmd_c++_test___.cpp(57):错误 C2090:函数返回数组

因此,这些“本机”数组存在的唯一原因是为了推断连续右值元素的大小,如下所示:

int pArray[2] = { 0, 2 };
size_t szArray = sizeof(pArray) / sizeof(int);

否则它的行为就像一个糟糕的指针。我的意思是,如果我们能够以某种方式限制输入,我们可以在数组参数中使用它有一些好处。例如这个函数:

void Func(int a1 [])

将 a1 限制为仅是一个右值数组,但正如您在第二个示例中看到的那样,它的行为就像:

void Func(int *a1)

而且,这里没有显示,比如:

void FuncAn(int a1 [2])

也看那里:C++11 - 区分右值指针

我认为如果将那些无用的“本机”数组替换为右值指针之类的东西会非常好。像这样的东西:

const int [rvalue pointer token] pArray = { 0, 2 };
size_t szArray = sizeofDataPointedByRvaluePointer(pArray) / sizeof(int);

并且能够创建如下功能:

void PrintString(const char[rvalue pointer token] pString)
{
    //Do Some printing the string code
}

void PrintString(const char *pString)
{
    //Do Some printing the string code

    delete [] pString; //Delete temporary object
}

如果传递了右值指针,则将调用第一个,否则将调用第二个。因此,您将能够执行以下操作:

const char[rvalue pointer token] StringArray = "Hello World!";

PrintString(StringArray); //void PrintString(const char[rvalue pointer token] pString) is invoked and the String is only printed without any other special handling

char *pString = new char[sizeofDataPointedByRvaluePointer(StringArray)];

memcpy(pString, StringArray, sizeofDataPointedByRvaluePointer(StringArray));

PrintString(pString); //void PrintString(const char *pString) is invoked and after the string is printed the memory allocated for it is destroyed

您可以清楚地看到创建这样的东西的好处。首先是创建更灵活功能的能力。其次 - 更好的可读性,使用一些标记来指示指向右值的指针更容易理解,因为用户会知道他正在处理一个指针(4 字节)而不是一些混淆数组类型,这会误导真实的大小目的。我可以找到很多优势,但这是我现在看到的。你会说什么 - 这是个好主意吗?

4

1 回答 1

0

int array[] 仅按如下方式使用(我相信)

int array[] = { 2, 5, 7, 7, 2 };

并且返回一个数组是不可能的,因为您需要知道数组有多大才能准确地返回它。我可能弄错了,但是 typedef int ArrayType[8]; 可能允许您返回 ArrayType,因为它具有定义的大小。不过不确定。

希望这能回答一些问题,但正如 BoBTFish 所说,读一本好书,不要从一开始就知道所有原因,你会学到很多东西。

于 2013-10-27T11:15:55.300 回答