專門做外貿(mào)的網(wǎng)站有哪些怎樣在百度上發(fā)布廣告
static 關(guān)鍵字的作用:
主要作用在于 控制變量或函數(shù)的作用域、生命周期以及它們?nèi)绾伪徊煌糠值?mark>程序訪問,從而幫助程序員管理內(nèi)存、避免命名沖突,并實現(xiàn)特定的設(shè)計模式(如單例模式)。
-
1. 靜態(tài)局部變量:當在一個函數(shù)內(nèi)部聲明一個靜態(tài)局部變量(如下面單例模式示例中的static BoxFactory boxFactory;),這個變量的生命周期將延伸到包含它的函數(shù)結(jié)束之后。這樣的靜態(tài)局部變量在程序運行期間只會被初始化一次,即使函數(shù)被多次調(diào)用。它保留了上一次函數(shù)調(diào)用結(jié)束時的值。
-
2.靜態(tài)全局變量:在文件作用域聲明的靜態(tài)變量(即在函數(shù)外部,但用static修飾),其作用范圍限制在定義它的源文件內(nèi),即它是“內(nèi)部鏈接”的。這意味著其他源文件中的代碼不能直接訪問這個變量,有助于減少命名沖突并封裝數(shù)據(jù)。
-
3.靜態(tài)成員變量:在類聲明中使用static聲明的成員變量不屬于類的任何特定實例,而是屬于整個類。所有類實例共享同一個靜態(tài)成員變量的副本。靜態(tài)成員變量必須在類定義之外初始化。靜態(tài)成員可以通過類名直接訪問,無需實例化對象。
-
4.靜態(tài)成員函數(shù):靜態(tài)成員函數(shù)也是類的一部分,但不與類的任何特定實例關(guān)聯(lián)。它們不能訪問非靜態(tài)成員變量(因為非靜態(tài)成員變量是特定于實例的),但可以訪問靜態(tài)成員變量和其他靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)同樣通過類名直接調(diào)用,無需實例化對象。
-
5.靜態(tài)外部變量聲明:在頭文件中使用extern和static聲明變量,可以讓多個源文件共享同一變量的聲明,但每個使用該聲明的源文件需要有一個獨立的定義(沒有static),以避免多重定義錯誤。這種方式主要用于跨文件共享常量或全局數(shù)據(jù)。
static 關(guān)鍵字示例:
1.靜態(tài)局部變量
下面代碼中有兩個函數(shù)fun1和fun2,其中fun2中的局部變量b用static關(guān)鍵字修飾成靜態(tài)局部變量,那么變量b不是在棧區(qū)上創(chuàng)建的,而是在靜態(tài)區(qū)上創(chuàng)建的。在靜態(tài)區(qū)上創(chuàng)建的變量,生命周期是全局的,也就是說,靜態(tài)局部變量的生命周期和程序的生命周期相同
我們分別運行五次fun1()和fun2(),會發(fā)現(xiàn)b只會被創(chuàng)建一次,后面執(zhí)行fun2()函數(shù)時由于存儲在靜態(tài)區(qū)沒有被銷毀,所以還是使用的已經(jīng)存在的b并不會重新創(chuàng)建,理解這一點對單例模式中全局唯一一次類的實例化很關(guān)鍵
void fun1() {int a = 0;a++;printf(" a = %d | ", a);
}void fun2() {static int b = 0;b++;printf(" b = %d | ", b);
}void main()
{for (size_t i = 0; i < 10; i++){if (i < 5) fun1();else fun2();}
}
2.靜態(tài)全局變量
靜態(tài)全局變量的例子就不舉例了,很多理解,被static修飾的全局變量只能在本cpp文件中訪問。
3.靜態(tài)成員函數(shù),靜態(tài)成員變量
設(shè)計模式中的工廠模式+單例模式很好解釋靜態(tài)成員函數(shù)的用法:
下面的代碼塊有四個類:
我們可以通過工廠類可以實例化圓形 和正方形,但每次用工廠類的時候,我們不需要每次都實例化一個工廠,因此工廠類就用到了單例模式,使工廠在整個系統(tǒng)的生命周期唯一,避免多次創(chuàng)建。
此外閱讀時注意工廠類中g(shù)etInstance()使用static 修飾,
static ShapeFactory& getInstance() //靜態(tài)成員函數(shù){static ShapeFactory instance; //靜態(tài)成員變量return instance;}
- 確保唯一性:通過將getInstance方法聲明為靜態(tài)成員函數(shù),可以不依賴于類的任何實例直接訪問。這使得無論何時何地調(diào)用getInstance,都只會返回同一個ShapeFactory實例,保證了全局唯一性。
- 全局訪問:靜態(tài)方法可以在不創(chuàng)建類實例的情況下被調(diào)用,因此可以在程序的任何地方訪問工廠類的單例,便于統(tǒng)一管理和協(xié)調(diào)對象的創(chuàng)建過程。
因此在調(diào)用時還可以寫成:
int main()
{auto circle = ShapeFactory::getInstance().createShape("Circle");if (circle){circle->draw();}auto square = ShapeFactory::getInstance().createShape("Circle");if (square){square->draw();}return 0;
}
#include <iostream>
#include <iostream>
#include <memory>
using namespace std;// 抽象形狀類
class Shape
{
public:virtual ~Shape() {}virtual void draw() const = 0;
};// 圓形類
class Circle : public Shape
{
public:void draw() const override{std::cout << "Drawing Circle" << std::endl;}
};// 正方形類
class Square : public Shape
{
public:void draw() const override{std::cout << "Drawing Square" << std::endl;}
};// 形狀工廠類 - 單例模式
class ShapeFactory
{
public:static ShapeFactory& getInstance(){static ShapeFactory instance;return instance;}Shape* createShape(const std::string& shapeType){if (shapeType == "Circle"){Circle* pCircle = new Circle();return pCircle;}else if (shapeType == "Square"){Square* pSquare = new Square();return pSquare;}else{return NULL;}}private:ShapeFactory() = default; // 私有構(gòu)造函數(shù)ShapeFactory(const ShapeFactory&) = delete; // 禁止拷貝構(gòu)造ShapeFactory& operator=(const ShapeFactory&) = delete; // 禁止賦值操作
};int main()
{ShapeFactory& factory = ShapeFactory::getInstance(); // 獲取工廠單例auto circle = factory.createShape("Circle");if (circle){circle->draw();}auto square = factory.createShape("Square");if (square){square->draw();}return 0;
}
我們可以通過一下代碼來驗證工廠類是否在全局中只創(chuàng)建了一次
// 形狀工廠類 - 單例模式
class ShapeFactory
{
public:static ShapeFactory& getInstance(){static ShapeFactory instance;return instance;}Shape* createShape(const std::string& shapeType){if (shapeType == "Circle"){Circle* pCircle = new Circle();return pCircle;}else if (shapeType == "Square"){Square* pSquare = new Square();return pSquare;}else{return NULL;}}private:ShapeFactory();// 私有構(gòu)造函數(shù)~ShapeFactory();ShapeFactory(const ShapeFactory&) = delete; // 禁止拷貝構(gòu)造ShapeFactory& operator=(const ShapeFactory&) = delete; // 禁止賦值操作
};ShapeFactory::ShapeFactory() {std::cout << "工廠類構(gòu)造函數(shù)" << std::endl;
}ShapeFactory::~ShapeFactory() {std::cout << "工廠析構(gòu)函數(shù)" << std::endl;
}
int main()
{for (int i = 0; i < 5; i++) {ShapeFactory& factory = ShapeFactory::getInstance(); // 獲取工廠單例std::cout << "i = " << i << std::endl;}return 0;
}