C++中static和const的作用和用法
- static:
- 靜態(tài)變量(static variable):在函數(shù)內部聲明的靜態(tài)變量在程序執(zhí)行期間保持其值,而不會在函數(shù)調用結束后銷毀。靜態(tài)變量只初始化一次,然后可以在后續(xù)函數(shù)調用中使用其最新值。
void foo() { static int counter = 0; counter++; cout << "Counter: " << counter << endl; } int main() { foo(); // 輸出:Counter: 1 foo(); // 輸出:Counter: 2 return 0; }
- 上述代碼中,靜態(tài)變量
counter
在每次調用foo()
時保持其值,并在每次調用后遞增。- 靜態(tài)函數(shù)(static function):在類中聲明的靜態(tài)函數(shù)與類的對象實例無關,可以直接通過類名訪問。靜態(tài)函數(shù)不能訪問非靜態(tài)成員變量,因為它們沒有this指針。
class MathUtils { public: static int add(int a, int b) { return a + b; } }; int main() { int result = MathUtils::add(3, 5); cout << "Result: " << result << endl; // 輸出:Result: 8 return 0; }
在上述代碼中,
add()
函數(shù)是一個靜態(tài)函數(shù),我們可以直接使用MathUtils::add()
進行調用。const:
- 常量變量(const variable):用
const
修飾的變量表示其值在程序執(zhí)行期間是不可修改的。
常量必須在聲明時進行初始化,并且不能在后續(xù)代碼中修改其值。
- 常量變量(const variable):用
int main() { const int MAX_VALUE = 100; // MAX_VALUE = 200; // 錯誤,不能修改常量的值 cout << "Max value: " << MAX_VALUE << endl; // 輸出:Max value: 100 return 0; }
- 在上述代碼中,
MAX_VALUE
被聲明為常量,一旦初始化后,其值將保持不變。- 常量引用(const reference):用
const
修飾的引用參數(shù)表示函數(shù)不會修改傳入的參數(shù)值。
- 常量引用(const reference):用
void printMessage(const string& message) { cout << "Message: " << message << endl; } int main() { string greeting = "Hello!"; printMessage(greeting); // 輸出:Message: Hello! return 0; }
在上述代碼中,printMessage()
函數(shù)接受一個常量引用參數(shù)message
,保證函數(shù)內部不會修改greeting
的值。
總結:
static
用于創(chuàng)建靜態(tài)變量和靜態(tài)函數(shù),靜態(tài)變量在程序執(zhí)行期間保持其值,靜態(tài)函數(shù)與類的對象實例無關。const
用于創(chuàng)建常量變量和常量引用,常量變量的值在初始化后不可修改,常量引用表示函數(shù)不會修改傳入的參數(shù)值。
static和const在類中的應用:
const:
在C++中,const成員變量的初始化需要在類的構造函數(shù)初始化列表(constructor initialization list)中進行
,而不能在構造函數(shù)的函數(shù)體內進行賦值操作。
以下是一個示例代碼,演示了如何初始化const成員變量:
class MyClass { private: const int myConstant; public: // 構造函數(shù) MyClass(int value) : myConstant(value) { // 在構造函數(shù)的初始化列表中對const成員變量進行初始化 // 可以使用參數(shù)或者其他表達式來賦值給const成員變量 // 構造函數(shù)的函數(shù)體內不能對const成員變量賦值 } void printConstant() { cout << "Constant value: " << myConstant << endl; } }; int main() { MyClass obj(42); obj.printConstant(); // 輸出:Constant value: 42 return 0; }
在上述代碼中,MyClass類有一個私有的const成員變量myConstant。構造函數(shù)MyClass(int value)中,在構造函數(shù)的初始化列表中使用參數(shù)value來初始化myConstant。
注意,在構造函數(shù)的函數(shù)體內不能對const成員變量進行賦值操作,因此必須使用構造函數(shù)的初始化列表來進行初始化。
通過這種方式,可以在創(chuàng)建對象時將值傳遞給const成員變量,并在對象的生命周期內保持其不變性。
static:
在C++中,靜態(tài)成員變量(static member variables)需要在類外進行初始化。初始化可以在類定義的外部進行,通常在類的實現(xiàn)文件(.cpp)中進行。這樣做是因為靜態(tài)成員變量屬于整個類而不是特定的對象實例,因此需要在類的定義之外進行初始化。
以下是一個示例代碼,演示了如何初始化靜態(tài)成員變量:
class MyClass { public: static int staticVariable; }; // 靜態(tài)成員變量的初始化 int MyClass::staticVariable = 10; int main() { cout << "Static variable: " << MyClass::staticVariable << endl; // 輸出:Static variable: 10 return 0; }
在上述代碼中,MyClass類有一個公有的靜態(tài)成員變量staticVariable。在類的定義外部,通過MyClass::staticVariable = 10;的方式進行初始化。這樣,所有屬于MyClass類的對象實例都共享同一個靜態(tài)成員變量。
可以通過類名和作用域解析運算符::來訪問靜態(tài)成員變量,如MyClass::staticVariable。
需要注意的是,靜態(tài)成員變量的初始化只能在類外進行一次。如果在類的多個源文件中都包含了該靜態(tài)成員變量的初始化語句,將導致重復定義錯誤。通常,將靜態(tài)成員變量的初始化放在類的實現(xiàn)文件中,并在頭文件中聲明靜態(tài)成員變量的存在。
靜態(tài)局部變量:
在 C++ 中,靜態(tài)局部變量(static local variables)是在函數(shù)內部聲明的靜態(tài)變量。與函數(shù)內的普通局部變量不同,靜態(tài)局部變量在函數(shù)的多次調用之間保持其值,并且僅在第一次進入聲明該變量的代碼行時進行初始化。
靜態(tài)局部變量的初始化只發(fā)生一次,以后每次進入聲明該變量的作用域時,都不會重新初始化,而是保留上一次的值。
下面是一個示例代碼,演示了靜態(tài)局部變量的用法:
#include <iostream> void foo() { static int counter = 0; counter++; std::cout << "Counter: " << counter << std::endl; } int main() { foo(); // 輸出:Counter: 1 foo(); // 輸出:Counter: 2 foo(); // 輸出:Counter: 3 return 0; }
在上述代碼中,foo()
函數(shù)內部聲明了一個靜態(tài)局部變量counter
。在每次調用foo()
時,counter
的值都會遞增,并在每次調用之間保留其值。這是因為靜態(tài)局部變量在函數(shù)的多次調用之間保持其狀態(tài)。
靜態(tài)局部變量的初始化只在第一次進入聲明它的代碼行時進行,之后的函數(shù)調用不會再次初始化它。這就是為什么在示例代碼中的后續(xù)調用中,counter
的值在前一次調用的基礎上遞增。
請注意,靜態(tài)局部變量的生命周期與程序運行期間一致,但其作用域僅限于聲明它的函數(shù)內部。這意味著其他函數(shù)無法直接訪問該靜態(tài)局部變量。
到此這篇關于C++中static和const的作用和用法的文章就介紹到這了,更多相關C++ static和const內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)“隱藏實現(xiàn),開放接口”的方案
本文從一個實例講解了C++實現(xiàn)“隱藏實現(xiàn),開放接口”的方案,文章條理清新,內容充實,需要的朋友可以參考下2015-07-07C語言數(shù)據(jù)結構進階之棧和隊列的實現(xiàn)
棧和隊列,嚴格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨作為一章,做重點講解2021-11-11Qt圖片繪圖類之QPixmap/QImage/QPicture詳解
這篇文章主要為大家詳細介紹了Qt圖片繪圖類中QPixmap、QImage和QPicture的使用方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-03-03Qt掃盲篇之QRegularExpression正則匹配總結
QRegularExpression是Qt5.0引進的,修復了很多bug,提高了效率,使用時建議使用QRegularExpression,下面這篇文章主要給大家介紹了關于Qt掃盲篇之QRegularExpression正則匹配的相關資料,需要的朋友可以參考下2023-03-03