簡體   English   中英

將數組作為 C++ 中方法的 const 參數傳遞

[英]passing an array as a const argument of a method in C++

我希望能夠將 const 數組參數傳遞給 C++ 中的方法。

我知道當您將數組傳遞給方法時,它與傳遞指向數組第一項的指針相同,因此一個簡單的方法是使用指針。

void myMethod(int * const inTab)

但是有一個數組有時更好,例如你可以寫出數組的大小。

您可以使用采用數組大小​​的模板: http//ideone.com/0Qhra

template <size_t N>
void myMethod ( const int (& intArray) [N] )
{
    std::cout << "Array of " << N << " ints\n";
    return;
}

編輯:避免代碼膨脹的一種可能方法是使用一個函數來獲取指針和執行實際工作的大小:

void myMethodImpl ( const int * intArray, size_t n );

和一個調用它的簡單模板,很容易內聯。

template <size_t N>
void myMethod ( const int (& intArray) [N] )
    { myMethodImpl ( intArray, N ); }

當然,您必須找到一種方法來測試它總是內聯,但您確實獲得了安全性和易用性。 即使在不是的情況下,您也可以以相對較低的成本獲得收益。

按3.9.3:2

應用於數組類型的任何cv-quali firs都會影響數組元素類型,而不是數組類型(8.3.4)。

和8.3.4:1

任何類型的形式“NT的cv-quali fi-seq數組”被調整為“N cv-quali-erq-seq T的數組”,並且類似地為“T的未知界限的數組”。

另外,按照8.3.5:5

在確定每個參數的類型之后,將“T數組”或“函數返回T”類型的任何參數分別調整為“指向T的指針”或“指向函數返回T的指針”。

這意味着在一個采用數組參數的函數中,參數類型實際上是一個指針,並且因為3.9.3:2指針是非cv限定的:

void foo(const int parameter[10]) {
    parameter = nullptr;   // this compiles!
}

這不會影響函數本身的類型,因為8.3.5:5中的另一個子句

生成參數類型列表后,在形成函數類型時,將刪除修改參數類型的任何頂級cv-quali。

因此,如果您希望能夠使用cv限定符傳遞數組,則必須通過引用:

void foo(const int (&parameter)[10]);

不確定這是不是你問的問題,但也許這就是你要找的東西

void func (const int array[10])
{
    //array[0] = 12345; // this wouldn't compile, so 'const' works
}

int main ()
{
    int array[10];
    func(array);
}

如果你需要數組的大小:

template < std::size_t Size >
void myMethod( const int ( &inTab )[ Size ] );

試試std::vector

void myMethod(const std::vector<int> &inTab);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM