[英]What is the meaning of leading underscores in a C++ constructor?
好吧我不是一個非常有經驗的C ++程序員,但我想知道下面的構造函數的參數中下划線的意義是什么?
class floatCoords
{
public:
floatCoords(float _x, float _y, float _width, float _height)
: x(_x), y(_y), width(_width), height(_height)
{
}
float x, y, width, height;
...
沒什么特別的。 他只是將其命名為區分成員變量和參數名稱。
Underscore是C ++標識符中的有效字符。
它只是一個方便的命名約定,它對語言沒有任何意義。 請確保不要使用大寫字母跟隨它: 雙下划線(__const)在C中的含義是什么?
最有可能的是,代碼的作者試圖避免初始化列表中數據成員名稱和構造函數參數名稱之間的潛在沖突。 很可能,作者並不知道C ++查找規則確保沖突不會發生。 即以下代碼也將產生預期的結果
class floatCoords {
public:
floatCoords(float x, float y, float width, float height)
: x(x), y(y), width(width), height(height)
{
}
float x, y, width, height;
...
雖然對於一個毫無准備的讀者來說可能會讓人感到困惑。
當然,在構造函數的主體內部,參數名稱將隱藏成員名稱,因此必須使用this->...
或限定名稱來訪問數據成員。 機會的作者可能也試圖避免這種情況。
這些只是不同人/機構所假設的變量命名慣例。 這看起來似乎沒必要,但在讀取和編寫代碼時實際上非常有用,尤其是當您擁有具有相同名稱的參數和成員變量時。 例如,你通常可以有這三種情況:
class A {
void foo(int age_) { //parameter
int age = 18; //local scope
if (age_ > age) cout << legal << endl;
}
int _age; //member
};
在上面的例子中:
它們只是傳入參數的名稱。它們碰巧匹配成員變量並用於初始化器。
沒有特別的意義 - 這只是一些人可能會使用的慣例。
它們沒有句法意義。 但是,如果你有一堆字段(例如x
, y
, width
和height
),那么命名構造函數參數是一個常見的約定,這些參數使用字段名稱加上前導下划線來初始化它們。
這些下划線的目的是區分參數變量float _x
和成員變量float x
。 從語法上講,由於下划線,沒有添加特殊含義。 當我不得不編寫C ++代碼時,我個人更喜歡用a_
前綴所有參數,並用m_
前綴所有成員變量。
因此,當我遇到需要混合和匹配局部,成員和參數變量的情況時,我知道我正在處理哪些變量。
int y = a_x * 2;
m_x = y + 3;
因為如果你要命名den float x,float y等,你就無法訪問該類的實際字段,因為它們具有相同的名稱。
它與語言無關,它只是實際程序員的一種約定(為了使代碼更明顯,我認為)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.