這是我在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;
定義兩個對象。
有趣的問題是爲什麼當每個數組中只有一個元素時需要定義數組。
該問題的答案取決於使用這些變量的代碼。在沒有看到使用它們的代碼的情況下,我必須向開發人員提供疑問,並假定需要數組。
一個想法 - 在未來它可以擴展到多個成員而無需更改任何其他代碼。 –