static關鍵字用法

static修飾局部變量

  • 靜態局部變量存儲在全局靜態區
  • 生存期為整個程序生命周期,但是其作用域仍與自動變量相同,只能在定義該變量的函數內使用該變量。退出該函數后,盡管該變量還繼續存在,但不能使用它。
  • 靜態局部變量若在聲明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。

static修飾全局變量

  • 非靜態全局變量的作用域是整個源程序,也即在各個源文件中都是有效的。
  • 而靜態全局變量則只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它?

?

二、C++ 中的static關鍵字(類中的static關鍵字)

1、static 數據成員

在類內數據成員的聲明前加上關鍵字static,該數據成員就是類內的靜態數據成員。

#include <iostream>  
using namespace std;class Myclass {
public:Myclass(int a, int b, int c);void GetSum();private:int a, b, c;static int Sum; //聲明靜態數據成員  
};int Myclass::Sum = 0; //定義并初始化靜態數據成員  
//static int Myclass::Sum = 0; //注意加static, 是錯誤的  Myclass::Myclass(int a, int b, int c)
{this->a = a;this->b = b;this->c = c;Sum += a + b + c;
}void Myclass::GetSum()
{cout << "Sum = " << Sum << endl;
}int main()
{Myclass M(1, 2, 3);M.GetSum(); // cout 6  Myclass N(4, 5, 6);N.GetSum(); // cout 21  M.GetSum(); // cout 21  
}

輸出結果:

?可以看出,static數據成員有以下特點:

(1). 對于非static數據成員,每個類對象都有自己的拷貝。而static數據成員被當作是類的成員。無論這個類的對象被定義了多少個,靜態數據成員在程序中也只有一份拷貝,由該類型的所有對象共享訪問

(2). 靜態數據成員存儲在全局數據區。靜態數據成員定義時才分配空間,所以不能在類聲明中定義。
在上例中,語句 int Myclass::Sum = 0; 是定義靜態數據成員;

(3). 靜態數據成員和普通數據成員一樣遵從public, protected, private 訪問規則;除了定義,定義不要管訪問規則。

(4). 因為靜態數據成員在全局數據區分配內存,屬于本類的所有對象共享,所以,它不屬于特定的類對象,在沒有產生類對象時其作用域就可見,即在沒有產生類的實例時,我們就可以操作它

(5). 靜態數據成員初始化與一般數據成員初始化不同。靜態數據成員初始化的格式為:

//<數據類型><類名>::<靜態數據成員名>=<值>  
int Myclass::Sum=0;  

(6). 類的靜態數據成員有兩種訪問形式:

//<類對象名>.<靜態數據成員名>  
M.Sum = 0  //<類類型名>::<靜態數據成員名>  
Myclass::Sum = 0  

(7). 靜態數據成員主要用在各個對象都有相同的某項屬性的時候。比如對于一個存款類,每個實例的利息都是相同的。所以,應該把利息設為存款類的靜態數據成員。這有兩個好處,第一,不管定義多少個存款類對象,利息數據成員都共享分配在全局數據區的內存,所以節省存儲空間。第二,一旦利息需要改變時,只要改變一次,則所有存款類對象的利息全改變過來了;

?

2、static 成員函數
? static 成員函數,它為類的全部對象服務而不是為某一個類的具體對象服務。普通的成員函數一般都隱含了一個this指針,但靜態成員函數由于不是與任何的對象相聯系,因此它不具有this指針。從這個意義上講,它無法訪問屬于類對象的no-static數據成員,也無法訪問no-static成員函數,它只能調用其余的靜態成員函數。

#include <iostream>  
using namespace std;class Myclass {
public:Myclass(int a, int b, int c);static void GetSum(); // 聲明靜態成員函數
private:int a, b, c;static int Sum; //聲明靜態數據成員  
};int Myclass::Sum = 0;//定義并初始化靜態數據成員  Myclass::Myclass(int a, int b, int c)
{this->a = a;this->b = b;this->c = c;Sum += a + b + c; //非靜態成員函數可以訪問靜態數據成員  
}//static void Myclass::GetSum(){...} //加上static是錯誤的  
void Myclass::GetSum() //靜態成員函數的實現  
{//cout<<a<<endl; //錯誤代碼,a是非靜態數據成員  cout << "Sum = " << Sum << endl; //靜態函數是能訪問靜態數據成員  
}int main()
{Myclass M(1, 2, 3);M.GetSum();Myclass N(4, 5, 6);N.GetSum();Myclass::GetSum();
}

關于靜態成員函數,可以總結為以下幾點:

  • (1). 在類體外,靜態函數的定義前不能加關鍵字static;
  • (2).?static成員之間可以相互訪問,包括static成員函數訪問static數據成員和訪問static成員函數;
  • (3). 非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;
  • (4). 靜態成員函數不能訪問非靜態成員函數和非靜態數據成員,只能訪問靜態的;
  • (5). 由于沒有this指針的額外開銷,因此靜態成員函數與類的全局函數相比速度上會有少許的增長
  • (6). 調用靜態成員函數,可以用成員訪問操作符(.)和(->)或直接用類名調用靜態成員函數

1

2

M.GetSum();??

Myclass::GetSum();?// 調用類的靜態成員函數。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1029 舊鍵盤 (20 分)

舊鍵盤上壞了幾個鍵&#xff0c;于是在敲一段文字的時候&#xff0c;對應的字符就不會出現。現在給出應該輸入的一段文字、以及實際被輸入的文字&#xff0c;請你列出肯定壞掉的那些鍵。 輸入格式&#xff1a; 輸入在 2 行中分別給出應該輸入的文字、以及實際被輸入的文字。每段…

volatile、const的用法

1. volatile 訪問寄存器要比訪問內存要塊&#xff0c;因此CPU會優先訪問該數據在寄存器中的存儲結果&#xff0c;但是內存中的數據可能已經發生了改變&#xff0c;而寄存器中還保留著原來的結果。為了避免這種情況的發生將該變量聲明為volatile&#xff0c;告訴CPU每次都從內存…

1030 完美數列 (25 分)

給定一個正整數數列&#xff0c;和正整數 p&#xff0c;設這個數列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;則稱這個數列是完美數列。 現在給定參數 p 和一些正整數&#xff0c;請你從中選擇盡可能多的數構成一個完美數列。 輸入格式&#xff…

《STL源碼剖析常見面試問題》

1. 當vector的內存用完了&#xff0c;它是如何動態擴展內存的&#xff1f;它是怎么釋放內存的&#xff1f;用clear可以釋放掉內存嗎&#xff1f;是不是線程安全的&#xff1f; (1). vector內存用完了&#xff0c;會以當前size大小重新申請2*size的內存&#xff0c;然后把原來…

1034 有理數四則運算 (20 分)

本題要求編寫程序&#xff0c;計算 2 個有理數的和、差、積、商。 輸入格式&#xff1a; 輸入在一行中按照 a1/b1 a2/b2 的格式給出兩個分數形式的有理數&#xff0c;其中分子和分母全是整型范圍內的整數&#xff0c;負號只可能出現在分子前&#xff0c;分母不為 0。 輸出格式&…

1035 插入與歸并 (25 分)

根據維基百科的定義&#xff1a; 插入排序是迭代算法&#xff0c;逐一獲得輸入數據&#xff0c;逐步產生有序的輸出序列。每步迭代中&#xff0c;算法從輸入序列中取出一元素&#xff0c;將之插入有序序列中正確的位置。如此迭代直到全部元素有序。 歸并排序進行如下迭代操作&a…

迭代式失效情況

vector 向容器插入元素后&#xff1a; 如果容器是vector或string&#xff0c;且存儲空間被重新分配&#xff0c;則指向容器的迭代器會失效&#xff1b;如果存儲空間未重新分配&#xff0c;指向插入點位置號之前的元素的迭代器仍然有效&#xff0c;但是指向插入點之后的元素的迭…

1039 到底買不買 (20 分)

小紅想買些珠子做一串自己喜歡的珠串。賣珠子的攤主有很多串五顏六色的珠串&#xff0c;但是不肯把任何一串拆散了賣。于是小紅要你幫忙判斷一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告訴她有多少多余的珠子&#xff1b;如果…

【Leetcode】111. 二叉樹的最小深度

給定一個二叉樹&#xff0c;找出其最小深度。 最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最小深度 2. 解題思路&#xff1a;…

1040 有幾個PAT (25 分

字符串 APPAPT 中包含了兩個單詞 PAT&#xff0c;其中第一個 PAT 是第 2 位(P)&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)&#xff1b;第二個 PAT 是第 3 位(P)&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)。 現給定字符串&#xff0c;問一共可以形成多少個 PAT&#xff…

g

1. 何時需要成員初始化列表&#xff1f;過程是什么&#xff1f; 當初始化一個引用成員變量時&#xff1b;初始化一個const成員變量時&#xff1b;當調用一個基類的構造函數&#xff0c;而構造函數擁有一組參數時&#xff1b;當調用一個成員類的構造函數&#xff0c;而他擁有一組…

【Leetcode | 1】93. 復原IP地址

給定一個只包含數字的字符串&#xff0c;復原它并返回所有可能的 IP 地址格式。 示例: 輸入: "25525511135" 輸出: ["255.255.11.135", "255.255.111.35"] 方法一&#xff1a; class Solution { public:vector<string> restoreIpAddresse…

1051 復數乘法 (15 分)

復數可以寫成 ( 的常規形式&#xff0c;其中 A 是實部&#xff0c;B 是虛部&#xff0c;i 是虛數單位&#xff0c;滿足 1&#xff1b;也可以寫成極坐標下的指數形式 (&#xff0c;其中 R 是復數模&#xff0c;P 是輻角&#xff0c;i 是虛數單位&#xff0c;其等價于三角形式 (。…

【Leetcode | 13】56. 合并區間

給出一個區間的集合&#xff0c;請合并所有重疊的區間。 示例 1: 輸入: [[1,3],[2,6],[8,10],[15,18]] 輸出: [[1,6],[8,10],[15,18]] 解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6]. 示例 2: 輸入: [[1,4],[4,5]] 輸出: [[1,5]] 解釋: 區間 [1,4] 和 [4,5] 可被視為重疊…

1050 螺旋矩陣 (25 分

本題要求將給定的 N 個正整數按非遞增的順序&#xff0c;填入“螺旋矩陣”。所謂“螺旋矩陣”&#xff0c;是指從左上角第 1 個格子開始&#xff0c;按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列&#xff0c;滿足條件&#xff1a;mn 等于 N&#xff1b;m≥n&#xff1b;且…

【Leetcode | 11】268. 缺失數字

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列&#xff0c;找出 0 .. n 中沒有出現在序列中的那個數。 示例 1: 輸入: [3,0,1] 輸出: 2 示例 2: 輸入: [9,6,4,2,3,5,7,0,1] 輸出: 8 說明: 你的算法應具有線性時間復雜度。你能否僅使用額外常數空間來實現? class Solution { p…

1053 住房空置率 (20 分)

在不打擾居民的前提下&#xff0c;統計住房空置率的一種方法是根據每戶用電量的連續變化規律進行判斷。判斷方法如下&#xff1a; 在觀察期內&#xff0c;若存在超過一半的日子用電量低于某給定的閾值 e&#xff0c;則該住房為“可能空置”&#xff1b; 若觀察期超過某給定閾值…

1052 賣個萌 (20 分)

萌萌噠表情符號通常由“手”、“眼”、“口”三個主要部分組成。簡單起見&#xff0c;我們假設一個表情符號是按下列格式輸出的&#xff1a; [左手]([左眼][口][右眼])[右手]現給出可選用的符號集合&#xff0c;請你按用戶的要求輸出表情。 輸入格式&#xff1a; 輸入首先在前三…

1054 求平均值 (20 分)

1054 求平均值 &#xff08;20 分&#xff09;本題的基本要求非常簡單&#xff1a;給定 N 個實數&#xff0c;計算它們的平均值。但復雜的是有些輸入數據可能是非法的。一個“合法”的輸入是 [?1000,1000] 區間內的實數&#xff0c;并且最多精確到小數點后 2 位。當你計算平均…