簡體   English   中英

在 C++ 中盡可能使用 const 嗎?

[英]Use const wherever possible in C++?

正如Effective C++一書中所述:“盡可能使用 const。”,人們會假設這個定義: Vec3f operator+(Vec3f &other); 最好定義為Vec3f operator+(const Vec3f &other) const; 甚至更好的const Vec3f operator+(const Vec3f &other) const; .

或者有 5 個const關鍵字的例子: const int*const Foo(const int*const&)const;

當然,您應該只在可以有const 的地方包含const 我問的是盡可能使用它們的好習慣嗎? 雖然它確實為您提供了更多錯誤安全代碼,但它可能會變得非常混亂。 或者你應該,例如,忽略指針和引用 const(除非你真的需要它),並且只在類型本身上使用它,如const int* Foo(const int* parameter)const; ,所以它最終不會太亂?

附加信息: http : //duramecho.com/ComputerInformation/WhyHowCppConst.html

提前致謝!

C++ 常見問題

如果您發現普通類型安全有助於您使系統正確(確實如此;尤其是在大型系統中),您會發現const正確性也有幫助。

當您想確保不會意外或有意更改變量時,您應該使用const 一些常量(全局和類靜態、字符串和整數,但不是具有非平凡構造函數的變量)可以放在可執行文件的只讀部分,因此如果您嘗試寫入它會導致分段錯誤。

您應該明確使用const作為遵循此原則的函數以及函數參數的說明符。 如果您不必更改實際參數,請將其設置為const 這不會限制此類函數的可能用法,而是擴展它們,因為現在它們可能用於const參數和const對象。

在聲明中

const int* foo(const int* const&) const;

每個const意味着不同的東西,是的,如果需要,顯然應該使用

概括

使用const提高程序的類型安全性。

C++ 常見問題

[18.3] 我應該“早點”還是“晚點”嘗試讓常量正確?

在非常、非常、非常開始的時候。

盡可能使用const通常是一件好事,但這是一個糟糕的措辭。 您應該在任何可能且有意義的地方使用const

最重要的是(它可能很少會打開額外的優化機會)它是一種記錄您不修改某些內容的意圖的方法。

在您給出的成員operator+的具體示例中,最好的解決方案不是將所有內容都設置為const ,而是創建一個獨立的operator+ ,它基於成員operator+=並按值接受一個參數,如下所示:

T operator+(T one, T const& two) const { return one += two; }

此解決方案適用於出現在加號兩側的T ,它允許鏈接,不復制代碼,並且允許編譯器執行最大的優化。
operator+的語義要求制作一個副本,因此您也可以讓編譯器制作它(另一個將被優化掉)。

可以將一個const&制作成one ,但是您必須手動制作一個副本,這可能是次優的(並且更難以理解)。

使用const您是在告訴編譯器某些內容。

然后它可以使用該信息來檢查您是否在做不應該做的事情,並使其能夠優化代碼。

所以當使用const它使它變得更聰明。

我認為盡可能使用const是一個好方法。 正如其他答案所述,它為您的代碼添加了隱式文檔並提高了類型安全性。

很高興知道您可以調用const函數而不必擔心它們是否會更改對象的內部狀態,並且傳遞const指針或對其他對象的引用將使其免受封裝破壞。 它還允許擁有const引用的對象從該引用指向的任何內容中獲得最大價值。

此外,從一開始就應用const是一個好主意,因為以后添加可能會很痛苦。 例如,如果您有一個類:

class A
{
public:

  //...

  int getCount()
  {
    return m_count;
  }

private:
  int m_count;
}

還有一個:

class B
{
public:

  //...

  int getInternalCount()
  {
    return m_a->getCount();
  }

private:
  A* m_a;
}

你想做:

void foo( const B* b )
{
  int count = b->getInternalCount();

  //-- Do something
}

這是一個完全有效的用例,但是您必須去將const添加到多個地方以支持它( B::getInternalCount()A::getCount() )。 如果您從一開始就這樣做,實際上使用const非常容易,並且它使其他開發人員的設計更加明顯。 如果您自己工作,它仍然有很大幫助,但不必擔心。 但是,當在團隊中工作時,我發現當我們開始強制執行const並改造我們的一些遺留代碼以更加遵守它時,它真的很有幫助。

長話短說:我建議始終使用它。

const的最初目的是處理通常在使用幻數和硬編碼值時出現的問題。

有點愚蠢,但如畫的例子來說明這一點。 這樣的代碼容易出錯且不方便。

c1 = 3.14159 * diameter1;
c2 = 3.14159 * diameter2;

您最好將 Pi 定義為常數。

const double PI = 3.14159;
c1 = PI * diameter1;
c2 = PI * diameter2;

與變量相比,常量具有“特權”。 在您的示例中,通過常量引用傳遞其他向量是有意義的,因為由於此函數將接受臨時(右值)作為其參數。

Vec3f operator+(const Vec3f &other) const;

// Would not be possible with Vec3f operator+(Vec3f &other) const;
Vec3f v = u + Vec3f(1, 0, 0);

使用constexpr您可以在上下文中使用常量,例如靜態數組分配

constexpr std::size_t LENGTH = 10;
int arr[LENGTH];

所以這不是為了防止你不小心設置了一些隨機值(你必須是非常愚蠢的程序員才會犯這樣的錯誤)。 盡可能使用它沒有意義,但僅當您想指定常量時才使用它。

這不是我第一次看到來自“Effective C++”的奇怪陳述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM