簡體   English   中英

將C ++成員函數聲明為static const會產生錯誤

[英]Declaring C++ member function as static const yields errors

我有以下類接口:

class Test
{
public: 
    Test();
    static void fun() const;

private:
    int x;
    static int i;
};

Test.cpp包含fun()的實現:

void Test::fun() const
{
   cout<<"hello";
}

它給了我錯誤... modifiers not allowed on static member functions

錯誤是什么意思? 我想知道為什么我無法創建靜態和const的函數。

void fun() const;

意味着fun可以應用於const對象(以及非const)。 沒有const修飾符,它只能應用於非const對象。

根據定義,靜態函數不需要對象。

const成員函數意味着無法調用類實例的其他非const成員

自由函數不是成員函數,因此它與類或類實例無關,因此它不能是const,因為沒有成員

靜態函數是一個自由函數,它的名稱作用於類名,使其始終相對於類型,但不與該類型的實例相關聯,因此仍然沒有成員可以訪問

在最后兩種情況下,沒有使用const訪問的意義,因為沒有成員可以訪問。

靜態函數在沒有實例的情況下工作,而const保證函數不會更改實例(即使它需要實例)。

如果您看到翻譯的代碼,可能會更容易理解:

   static void fun();

在一天結束時被轉換為一個不帶參數的函數,即

   void fun();

對於另一個例子,

   void fun() const;

在一天結束時被轉換為表格的功能

   fun(const Test& self)

因此, static void fun() const有兩個相互矛盾的含義。

順便說一句:這個轉換發生在所有成員函數中(const或不是)

幾個小時前我在這里回答了這個問題: 為什么我們需要將const放在函數頭的末尾但是首先是靜態的?

(SO系統對我的回復不滿意。自動轉換為評論)

也許有一個簡單的代碼示例會有所幫助。

class Foo {
public:
    static void static_function();
    void const_function() const;
};

// Use of static function:
Foo::static_function();

// Use of const function:
Foo f;
f.const_function();

兩者之間的關鍵區別在於const函數是一個成員函數 - 也就是說,它是在Foo類的實例上調用的。 這意味着您首先需要實例化Foo類型的對象,然后該對象充當對const_function的調用的const_function const本身意味着您不會修改作為該函數調用的接收者的對象的狀態。

另一方面, static函數本質上是一個自由函數,您可以在沒有接收對象的情況下調用它。 但是,在定義它的類的范圍之外,您需要使用類名限定它: Foo::static_function

這就是為什么有一個staticconst的函數是沒有意義的,因為它們在完全不同的上下文中使用。 有沒有必要擔心調用時修改任何對象的狀態static函數,因為沒有接收對象-這只不過是調用像一個免費的功能。

因為類的static const函數沒有意義。 const表示事物(對象/變量)保持不變。 靜態意味着事物object等在該上下文中保持不變。

暫無
暫無

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

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