这是我在OpenCV中遇到的两行C++代码。单成员数组?
const Point* ppt[1] = { rookPoints[0] };
int npt[] = { 20 };
那是什么和之间的区别如下:
const Point* ppt = rookPoint[0];
int npt = 20;
请问一个成员阵列有超过一个变量的任何特别的优势?
这是我在OpenCV中遇到的两行C++代码。单成员数组?
const Point* ppt[1] = { rookPoints[0] };
int npt[] = { 20 };
那是什么和之间的区别如下:
const Point* ppt = rookPoint[0];
int npt = 20;
请问一个成员阵列有超过一个变量的任何特别的优势?
使用1单元数组意味着如果数组中元素的数量增加,则使用它的代码不必改变。
优点进来结合其它技术,没有特别因为用1个元素的数组
例如,给定像
int npt[] = {20};
的后续码可能会做
for (i = 0; i < sizeof(npt)/sizeof(*npt); ++i)
{
// do something worthwhile with npt[i]
}
如果随后将npt[]
的定义更改为
int npt[] = {20, 30, 40};
那么后面的代码仍然可以按预期工作。
鉴于,如果我们用int npt = {20};
表示,如果在将来的某个时间需要扩展以处理2个或更多值的数组,则需要重写“后续代码”。
显然它是课程的马匹。这种技术将用于基于数组中有1个或更多值的设计(以及通过给出这样的设计规范的代码生成器)中。
另一个有用的例子是typedef-one-element数组来创建一个类型,这个类型可以正常地在函数原型中声明在堆栈上,并传递给函数而不需要明确地使用操作符的地址;数组自然会降级为指向其第一个(唯一)元素的指针,因此它会成为一种自动传递,即使在C中也是如此的类型.GMP广泛使用这种技术。 – ShadowRanger
你的解释非常出色!现在看来问题已经解决了。 – DzReal
@ShadowRanger该技术也使代码难以理解,例如GMP代码看起来像是按值传递变量,但实际上它们是通过引用传递的。 –
从句法上看,差异是显而易见的。
const Point* ppt[1] = { rookPoints[0] };
int npt[] = { 20 };
限定两个阵列而
const Point* ppt = rookPoint[0];
int npt = 20;
定义两个对象。
有趣的问题是为什么当每个数组中只有一个元素时需要定义数组。
该问题的答案取决于使用这些变量的代码。在没有看到使用它们的代码的情况下,我必须向开发人员提供疑问,并假定需要数组。
一个想法 - 在未来它可以扩展到多个成员而无需更改任何其他代码。 –