2016-02-24 3 views
5

配列は関数へのポインタとして渡すことも、参照として渡すこともできます。それを参照として渡すと、sizeofとcountの演算子も動作するエイリアスが得られます。これにより、参照によるパスが優れて見えるようになります。C++:関数への配列参照を渡すのが普通ですか?

しかし、ポインタによるパスは本の標準であるようです。どうして?配列の参照渡しについて特に知っておく必要があるものはありますか?

答えて

5

参照渡しは、関数が固定サイズの配列しか受け付けないことを意味します(そのため、コンパイラはそのサイズを知っています)。ポインタを渡すことは、そうでないことを意味する。また、ポインタを渡すことで、より良いか悪いのためにnullptrを渡すことができます。

+1

!動的に割り当てられた配列は、参照渡しのパラメータとして受け入れられませんか?どうして?参照はすべて後にエイリアスです。 – quantum231

+0

@ quantum231配列を動的に割り当てることは既にポインタを返しています。 –

+1

自動割り当ての要件はありませんが、タイプの問題があります。例: 'void f(int(&arg)[5]);' 'void g(){f(*新しいint [1] [5]);}' –

1

私は通常std::vectorを使用してconst参照渡したいと思います。つまり、私のAPIがある時点でCコードによって呼び出される場合、constポインタによるパスを使用することは意味をなさないかもしれませんが、サイズを送信しなければならない場合もあります。 std::arrayまたはstd::vectorで関数を呼び出すことができる場合は、ポインタ(およびサイズ)またはイテレータのセット(begin/end)を送信することができます。

std :: arrayの使用については、テンプレートの引数に配列のサイズが必要です。これは固定サイズを必要とするだろう、通常の機能に意味ないだろう:私たちはテンプレート機能、サイズのテンプレートをすれば

void myfunc(const std::array<int, 5>& mydata){...} 

はしかし、それはもはや問題です。私たちは、スタックに割り当てられたCスタイルの配列について話している場合は

template<unsigned int SZ> 
void myfunc(const std::array<int, SZ>& mydata) {...} 

は...グッドC++スタイルは、Cスタイルの配列へのstd ::配列/ STD ::ベクトルを好むことです。私は、C++ Coding Standard by Herb Sutterチャプター77を読むことをお勧めします。 Cスタイルの配列を使用する場合は、ポインタとサイズを送信することが標準的な方法です。

関連する問題