在C++中将数组作为方法的常量参数传递
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 << " intsn";
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 限定符都会影响数组元素类型,而不是数组类型 (8.3.4(。
和 8.3.4:1
任何 形式"cv-qualifier-seq array of N T"的类型被调整为"N cv-qualifier-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 限定符在形成 函数类型。
因此,如果您希望能够传递带有 cv 限定符的数组,则必须通过引用:
void foo(const int (¶meter)[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);
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 为什么常量方法可以采用非常量引用?
- 常量方法中的非常量 lambda 捕获
- 友元方法作为常量
- 一个模板方法,用于同时接受常量和非常量参数
- 使用大量已知常量变量的正确方法
- 使用迭代器替换映射中的常量项的方法
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- Gmock 常量方法不调用,而是调用原始方法
- 为什么我们需要常量方法?
- 从模块导出全局常量的正确方法是什么?
- 模板常量/非常量方法
- 定义常量变量的最佳方法
- 常量字符*的模板方法专用化
- 常量静态成员函数:有另一种方法可用吗?
- 使方法常量后声明不兼容
- c++ 是否提供了一种使整个结构常量(不可修改)的方法?
- 当底层OpenGL状态被修改时,我应该声明一个方法常量吗