[英]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
。
這就是為什么有一個static
和const
的函數是沒有意義的,因為它們在完全不同的上下文中使用。 有沒有必要擔心調用時修改任何對象的狀態static
函數,因為沒有接收對象-這只不過是調用像一個免費的功能。
因為類的static
const
函數沒有意義。 const
表示事物(對象/變量)保持不變。 靜態意味着事物object
等在該上下文中保持不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.