欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 中 const 和 static 關(guān)鍵字用法及定義

 更新時間:2025年09月19日 10:27:46   作者:小小小~  
本文給大家介紹C++中const和static 關(guān)鍵字用法及定義,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

一、static 定義及用途

static 作用: 控制變量的存儲方式和可見性
1、修飾局部變量:
通常局部變量在程序中存放棧區(qū),局部的生命周期在包含語句塊執(zhí)行完時便會結(jié)束,使用 static 關(guān)鍵字對局部變量修飾后,變量會存放靜態(tài)數(shù)據(jù)區(qū),其生命周期會延續(xù)到整個程序結(jié)束。
但是作用域沒有改變,作用域還是限制在其他語句塊中。
個人理解: static 修飾局部變量,可認為是 延長變量生命周期的局部變量(不會隨著函數(shù)結(jié)束而是放)
2、修飾全局變量:
對于一個全局變量,它既可以在本文件中被訪問到,也可以在同一個?程中其它源?件被訪問(添加 extern進?聲明即可)。? static 對全局變量修飾改變了其作用域范圍,由原來的整個?程可?變成了本?件可?。
3、修飾函數(shù):
和全局變量一樣 ,改變作用域,限制在本文件使用。
4、修飾類 :
對類中某函數(shù)修飾,表示該函數(shù)屬于一個類,而不是此類的任何對象 ;
對類中某一個變量修飾 , 便是該變量為所有對象所有,存儲空間中只有一個副本,可以通 過類和對象調(diào)用。
(補充:靜態(tài)非常量數(shù)據(jù)成員,其只能在類外定義和初始化,在類內(nèi)僅是聲明而已。)
樣例如下;

5:類成員/類函數(shù)聲明
函數(shù)體內(nèi) static 變量范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配?次,因此其值在下次調(diào)?時仍維持上次的值;
在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;
在模塊內(nèi)的 static 函數(shù)只可被這?模塊內(nèi)的其它函數(shù)調(diào)?,這個函數(shù)的使?范圍被限制在聲明它的模塊內(nèi);
在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;
在類中的 static 成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收this 指針,因?只能訪問類的static 成員變量。 static類對象必須要在類外進?初始化, static 修飾的變量先于對象存在,所以 static 修飾的變量要在類外初始化;
由于 static 修飾的類成員屬于類,不屬于對象,因此 static 類成員函數(shù)是沒有 this 指針, this 指針是指向本對象的指針,正因為沒有this 指針,所以 static 類成員函數(shù)不能訪問? static 的類成員,只能訪問 static修飾的類成員;
static 成員函數(shù)不能被 virtual 修飾, static 成員不屬于任何對象或?qū)嵗约由?virtual沒有任何實際意義;靜態(tài)成員函數(shù)沒有 this 指針,虛函數(shù)的實現(xiàn)是為每?個對象分配?個 vptr 指針,? vptr 是通過 this 指針調(diào)?的,所以不能為virtual;虛函數(shù)的調(diào)?關(guān)系,this->vptr->ctable->virtual function。

class Person
{
public:
	Person(string name,int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
  //靜態(tài)函數(shù)
   	static void func()
	{
		//m_age = 50;   靜態(tài)函數(shù)只能訪問靜態(tài)變量
		m_score = 99;
		cout << m_score << endl;
	}
	string m_name;
	int m_age;
   //靜態(tài)成員變量   類內(nèi)聲明
	static int m_score; 
};
int Person::m_score = 100; //靜態(tài)變量 類外初始化
int main()
{
	Person p1("張三" , 18);
	Person p2("李四", 20);
	cout << "成績 " << p1.m_score << endl; //通過類對象訪問
	p2.m_score = 80; //靜態(tài)變量 只有一個副本,一個內(nèi)存空間
	cout<< "成績 " << p2.m_score << endl; 
  //靜態(tài)函數(shù)調(diào)用
	Person::func();    // 通過類調(diào)用
	p1.func();         //通過類對象調(diào)用
	return 0;
}

二、const 定義及用途

const 作用:限制可讀性
1、const修飾基礎(chǔ)數(shù)據(jù)類型
const 在基礎(chǔ)數(shù)據(jù)類型前、后結(jié)果一樣,在使用這些常量的時候不能改變常量的值。修飾符 const 可以?在類型說明符前,也可以用在類型說明符后,其結(jié)果是一樣的。在使用這些常量的時候,只要不改變這些常量的值即可。

const int Max = 100;
int const Min = 1;
void demo()
{
	//Max = 110; 常量不可修改
	//Min = 2;   常量只讀性
	cout << Max << Min << endl;
}

2、修飾指針變量和引用變量
如果const 在 * 左側(cè) ,則const修飾指針所指向的變量 ,即指針指向常量

如果const 在 * 右側(cè) ,則const修飾指針本身 ,即指針本身為常量。

int a = 10, b = 20;
//使 指針指向常量   (指針指向可改 ,指向的值不可以更改)
const int* p1 = &a;  
p1 = &b;
//*p1 = 100;              錯誤用法
 //使 指針本身為常量  (指針指向不可改 ,指向的值可以更改)
int* const p2 = &b; 
//p2 = &a;              錯誤用法
*p2 = 100;

3、const 修飾普通函數(shù)
防止傳入的參數(shù)在函數(shù)體內(nèi)被改變,但僅對指針、引用有意義。因為如果是按值傳遞,傳給參數(shù)的僅僅是實參的副本,即使在函數(shù)體內(nèi)改變了形參,實參也不會得到影響。如:

void func(const int i)
{
	//i = 10;  不能修改i
	cout << i << endl;
}

const修飾的函數(shù)參數(shù)是指針時,代表 在函數(shù)體內(nèi)不能修改該指針所指的內(nèi)容,起到保護作用:

void fun(const char * src, char * des)
{  
  //保護源字符串不被修改,若修改src則編譯出錯。
	strcpy(des,src);
}

const 修飾函數(shù)返回值
用const來修飾返回的指針或引用,保護指針指向的內(nèi)容或引用的內(nèi)容不被修改。

//const 修飾函數(shù)返回值 
const int* getNum(int* a)
{
	return a;
}
int a = 10;
auto ret= getNum(&a);
//ret = 20  返回值不能修改

4、const 在類中的?法:
const 成員變量,只在某個對象生命周期內(nèi)是常量。對于整個類而言是可以改變的。因為類可以創(chuàng)建多個對象,不同的對象其 const 數(shù)據(jù)成員值可以不同。所以不能在類的聲明中初始化 const 數(shù)據(jù)成員,因為類的對象在沒有創(chuàng)建時候,編譯器不知道 const 數(shù)據(jù)成員的值是什么 const 數(shù)據(jù)成員的初始化只能在類的構(gòu)造函數(shù)的初始化列表中進?。

const 成員函數(shù):
const 成員函數(shù)的主要?的是防?成員函數(shù)修改對象的內(nèi)容。要注意 const 關(guān)鍵字和 static 關(guān)鍵字對于成員函數(shù)來說是不能同時使?的,因為 static 關(guān)鍵字修飾靜態(tài)成員 函數(shù)不含有 this 指針,即不能實例化 const 成員函數(shù)?必須具體到某?個函數(shù)。

常量對象:
常量對象只能調(diào)用常量函數(shù),別的成員函數(shù)都不能調(diào)用。

補充: const 成員函數(shù)中如果實在想修改某個變量,可以使用mutable進行修飾。成員變量中如果想建立在整個類中都恒定的常量,應(yīng)該用類中的枚舉常量來實現(xiàn)或者 static const。

class Person
{
public:
	Person(string name,int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	//常函數(shù)
	void func() const
	{
		m_sore = 100;
	}
	//普通成員函數(shù)
	void Print()
	{
		cout << "姓名: " << this->m_name << "  年紀:" << this->m_age << end;
	}
	string m_name;
	int m_age;
	mutable int m_sore =60;  //特殊變量
};
int main()
{
	const Person p("張三", 18);  // 常對象
	//常對象調(diào)用常函數(shù)
	p.func();
	//p.Print();  常對象只能調(diào)用常函數(shù)
	p.m_sore = 160;   //m_sore 為特殊變量只能在常對象下修改
	cout << p.m_sore << endl;
	system("pause");
	return 0;
}

到此這篇關(guān)于C++ 中 const 和 static 關(guān)鍵字用法及定義的文章就介紹到這了,更多相關(guān)C++ const 和 static用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#復(fù)制和深度復(fù)制的實現(xiàn)方法

    C#復(fù)制和深度復(fù)制的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狢#復(fù)制和深度復(fù)制的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 基于C++實現(xiàn)簡單的日期計算機

    基于C++實現(xiàn)簡單的日期計算機

    這篇文章主要為大家詳細介紹了如何基于C++實現(xiàn)簡單的日期計算機,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • C語言實現(xiàn)兩個變量值交換的三種方式

    C語言實現(xiàn)兩個變量值交換的三種方式

    兩個變量值的交換是編程中最常見的問題之一,以下將介紹三種變量的交換方式,其中第一種方式是最常用也是最實用的,后兩種方式一般只在特殊限制下使用,需要的朋友可以參考下
    2025-03-03
  • C語言開源庫iniparser解析ini文件的方法

    C語言開源庫iniparser解析ini文件的方法

    INI(Initialization?File)文件是一種簡單直觀的數(shù)據(jù)存儲格式,常用于配置應(yīng)用程序的初始化設(shè)置,使用?iniparser?庫的應(yīng)用程序可以很方便地讀取和解析INI文件中的配置信息,大大簡化了對配置文件的處理工作,降低了程序的開發(fā)復(fù)雜度,感興趣的的朋友跟隨小編一起看看吧
    2024-04-04
  • C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng)

    C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 使用C語言實現(xiàn)12種排序方法

    使用C語言實現(xiàn)12種排序方法

    這篇文章主要介紹了用C語言完整實現(xiàn)12種排序方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • C語言實現(xiàn)二叉樹的示例詳解

    C語言實現(xiàn)二叉樹的示例詳解

    這篇文章主要為大家詳細介紹了C語言中二叉樹的算法實現(xiàn)以及二叉樹的遍歷算法與應(yīng)用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-06-06
  • Qt利用DOM類實現(xiàn)讀取xml文件

    Qt利用DOM類實現(xiàn)讀取xml文件

    Dom(Document Object Model,即文檔對象模型)能把XML文檔轉(zhuǎn)換成應(yīng)用程序可遍歷的樹形結(jié)構(gòu),這樣便可以隨機訪問其中的節(jié)點。本文將詳細講講實現(xiàn)的方法,需要的可以參考一下
    2022-06-06
  • C與C++中結(jié)構(gòu)體的區(qū)別

    C與C++中結(jié)構(gòu)體的區(qū)別

    C中的結(jié)構(gòu)體只涉及到數(shù)據(jù)結(jié)構(gòu),而不涉及到算法,也就是說在C中數(shù)據(jù)結(jié)構(gòu)和算法是分離的,而到C++中一類或者一個結(jié)構(gòu)體可以包含函數(shù)(這個函數(shù)在C++我們通常中稱為成員函數(shù)),C++中的結(jié)構(gòu)體和類體現(xiàn)了數(shù)據(jù)結(jié)構(gòu)和算法的結(jié)合
    2013-10-10
  • 詳解 linux c++的編譯器g++的基本使用

    詳解 linux c++的編譯器g++的基本使用

    這篇文章主要介紹了詳解 linux c++的編譯器g++的基本使用的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評論