国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++靜態(tài)成員(static)

這篇具有很好參考價值的文章主要介紹了C++靜態(tài)成員(static)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、什么是靜態(tài)成員?

由關鍵字static修飾類體中成員,稱為類靜態(tài)成員(static class member)。類的靜態(tài)成員為其所有對象共享,不管有多少對象,靜態(tài)成員只有一份存于公共內(nèi)存中。靜態(tài)數(shù)據(jù)成員被當作該類類型的全局對象。

二、靜態(tài)屬性

在類設計中,用關鍵字static修飾的數(shù)據(jù)成員為靜態(tài)數(shù)據(jù)成員。由該類型實例化的所有對象,共享系統(tǒng)為靜態(tài)成員分配的一個存儲空間,而這個存儲空間是程序執(zhí)行main函數(shù)之前分配的,在實例化對象時不再為靜態(tài)成員分配空間(靜態(tài)成員數(shù)據(jù)不在對象空間中)。

1、設計靜態(tài)數(shù)據(jù)成員目的是信息共享;

示例:

class Circle
{
private:
double pi; //
double radius; // 半徑
public:
Circle(double r = 0.0):pi(3.14),radius(r) {}
~Circle() {}
void area() const
{
return pi * radius * radius;
}
};
int main()
{
Circle cir(12.23);
cir.area();
size_t sz = sizeof(cir);
return 0;
}

?全局變量:

double pi = 3.14;
class Circle
{
private:
double radius; // 半徑
public:
Circle(double r = 0.0):pi(3.14),radius(r) {}
~Circle() {}
void area() const
{
return pi * radius * radius;
}
};

類的靜態(tài)數(shù)據(jù)成員:

class Circle
{
private:
//靜態(tài)成員的聲明,注意私有
static double pi;
private:
double radius;
public:
Circle(double r = 0.0):pi(3.14),radius(r) {} //error
Circle(double r = 0.0):radius(r) {} // ok;
Circle(double r = 0.0):radius(r)
{
pi = 3.14; // ok; 但是沒有必要
}
};
//靜態(tài)成員的定義
double Circle::pi = 3.14;

總結(jié):

同全局變量相比,使用靜態(tài)數(shù)據(jù)成員有兩個優(yōu)勢:

1、靜態(tài)數(shù)據(jù)成員沒有進入程序的全局名字空間,因此不存在與程序中其他全局名字沖突的可能性。

2、可以實現(xiàn)信息隱藏,靜態(tài)成員可以是private成員,而全局變量不能。?

2、靜態(tài)數(shù)據(jù)是該類所有對象所共有的,可提供同一類型的所有對象之間,信息共享或信息交換的一種方式。

靜態(tài)數(shù)據(jù)成員屬于整個類型,使用時可用以下格式:

類名::靜態(tài)數(shù)據(jù)成員名 或 對象.靜態(tài)數(shù)據(jù)成員名(前提是可訪問符為public)

示例:

用靜態(tài)數(shù)據(jù)成員記錄由同一類建立的對象的數(shù)量。

定義學生類,統(tǒng)計學生的信息:

  • 通過定義一個全局變量統(tǒng)計當前學生總數(shù),全局變量可以實現(xiàn)對象的共享,但是沒有權限的限制,導致其他的函數(shù)或者對象可以無限制修改,則會出現(xiàn)問題(不安全);
  • 使用static,利用普通成員變量進行統(tǒng)計,普通成員變量是本類某個對象獨有的,類作用域,不能實現(xiàn)共享,外界修改不了(比較安全)。
int m_count = 0;//1、全局變量
//全局變量可以實現(xiàn)對象的共享,但是沒有權限的限制,導致其他的函數(shù)或者對象可以無限制修改,則會出現(xiàn)問題(不安全)
class Student
{
public:
	Student(int num = 0, const char* name = "", char sex = 'm'):m_num(num), m_sex(sex)
	{
		m_name = new char[strlen(name) + 1];
		strcpy_s(m_name, strlen(name) + 1, name);
		m_count++;
	}
	~Student()
	{
		if (m_name != NULL)
		{
			delete[]m_name;
			m_name = NULL;
		}
	}
	void Print(){
		cout << "總數(shù)" << m_count << endl;
	}
private:
	int m_num;
	char* m_name;
	char m_sex;
	static int m_count;//2、普通成員變量是本類某個對象獨有的,類作用域,不能實現(xiàn)共享,外界修改不了(比較安全)
};
int Student::m_count;
void main()
{
	Student s(1001, "張三", 'm');
	Student s1(1003, "張三", 'w');
	Student s2(2005, "張三", 'm');
	s.Print();
	s1.Print();
	s2.Print();
}

3、在類的成員函數(shù)中使用靜態(tài)數(shù)據(jù)成員,靜態(tài)數(shù)據(jù)成員之前沒有this

class Cat // 貓
{
private:
static int num;
private:
std::string _owner; //貓主
std::string _name; //貓名
public:
Cat(const string &owner,
const string &name):_owner(owner),_name(name)
{
num+=1;
cout<<"create Cat num: "<< num<<endl;
}
~Cat()
{
num-=1;
cout<<"Destroy Cat num: "<<num<<endl;
}
void print() const
{
cout<<"Owner: "<<_owner<<" Name: "<<name<<endl;
num+=1; // not this;
}
};

4、若類中含有靜態(tài)成員,則該成員不在能本類中開辟空間,靜態(tài)數(shù)據(jù)成員不占類的大小,不能在構造函數(shù)中初始化。

class A
{
public:
	//A():m_a(1),m_b(2),m_c(3){}//m_c不能在構造函數(shù)中初始化
	A() :m_a(1), m_b(2)
	{
		//m_c = 3;//賦值, 沒有給m_c開辟空間
		m_c++;
	}
	void Print()
	{
		cout << m_c << endl;
	}
private:
	int m_a;//4
	char m_b;//1 1->4
	static int m_c;//m_c沒有在A類開辟空間 
	//引用性聲明,僅用于聲明
};
int A::m_c = 0;//定義性聲明  開辟空間
void main()
{
	cout << sizeof(A) << endl;
	A a;
	a.Print();
	A b;
	b.Print();
}

5、靜態(tài)屬性的類型是int,short,char,并且是const,可以在類中直接初始化

class Bar
{
private:
static const int nameSize = 20; // ok;
static const char name[nameSize]="xiao cheng bar"; // error;
};

?6、靜態(tài)數(shù)據(jù)成員的類型可以是其所屬類,而非static數(shù)據(jù)成員只能被聲明為該類的指針

class Bar
{
private:
std::string _name;
private:
static Bar sm_bar; // ok;
private:
Bar m_bar; // error;
Bar *pb; // ok;
};

總結(jié):

1、設計靜態(tài)數(shù)據(jù)成員目的是信息共享和信息交流

2、類的靜態(tài)數(shù)據(jù)成員為所有類對象所共享,不屬于某個具體的實例

3、類的靜態(tài)數(shù)據(jù)成員必須在類外定義,定義時不添加static關鍵字,不能在構造函數(shù)的初始化列表中創(chuàng)建

4、類的靜態(tài)數(shù)據(jù)成員類型是int,short,char,long long,并且是const,可以在類中直接初始化,也可以在類外初始化

5、在類的成員函數(shù)中使用靜態(tài)數(shù)據(jù)成員,靜態(tài)數(shù)據(jù)成員之前沒有this

6、當類的靜態(tài)數(shù)據(jù)成員為公有時,可以在外部函數(shù)使用:類名::靜態(tài)數(shù)據(jù)成員名 或 對象.靜態(tài)數(shù)據(jù)成員名,可以在類體中定義自身的靜態(tài)類型對象

三、靜態(tài)方法?

函數(shù)成員說明為靜態(tài),將與該類的不同對象無關。靜態(tài)函數(shù)成員的調(diào)用,在對象之外可以采用下面的方式:

類名::函數(shù)名 或 對象名.函數(shù)名

與靜態(tài)數(shù)據(jù)成員相反,為使用方便,靜態(tài)函數(shù)成員多為公有。

class Object
{
private:
static int num;
private:
int value;
public:
Object(int val = 0):value(val),num(val) {}// error;靜態(tài)屬性只能在類外初始化
Object(int val):value(val)
{
num = 1; // 不是初始化,是賦值
}
void print()
{
cout<<"value: "<<value<<" num: "<<num<<endl;
}
static void show() // 靜態(tài)函數(shù) not this
{
cout<<"value: "<<value<<" num: "<<num<<endl;
}
static void fun(Object &obj) // const // 不能定義為常方法。
{
cout<<obj.value<<" "<<num<<endl;
}
};
int Object::num = 0;

?靜態(tài)成員函數(shù)沒有this指針,因此在靜態(tài)成員函數(shù)顯式地使用this指針都將導致編譯時刻錯誤。試圖訪問隱式使用this指針所指向的非靜態(tài)數(shù)據(jù)成員也會導致編譯時刻錯誤。

class Student
{
public:
	Student(int num = 0, const char* name = "", char sex = 'm') :m_num(num), m_sex(sex)
		//m_count(0),m_num(num),m_sex(sex)
	{
		m_name = new char[strlen(name) + 1];
		strcpy_s(m_name, strlen(name) + 1, name);
		m_count++;
	}
	~Student()
	{
		if (m_name != NULL)
		{
			delete[]m_name;
			m_name = NULL;
		}
	}
	void Print() {
		cout << "總數(shù)" << m_count << endl;
	}
	//在static函數(shù)中,沒有this指針,所以不能直接輸出非靜態(tài)數(shù)據(jù)成員
	static void Show(Student &s )
	{
		cout << "Show" << endl;
		cout << s.m_num << s.m_name << s.m_sex << m_count << endl;
	}
private:
	int m_num;
	char* m_name;
	char m_sex;
	static int m_count;
	//const int m_j;//成員初始化列表
	//const static int m_i = 20;
};
int Student::m_count;
void main()
{
	Student s(1001, "張三", 'm');
	Student s1(1003, "張三", 'w');
	Student s2(2005, "張三", 'm');
	s.Print();
	s1.Print();
	s2.Print();
	s.Show(s);//沒有this指針來接收,不管是用哪個對象來調(diào)用static,本質(zhì)使用當前對象的類型Student來調(diào)用
	Student::Show(s2);//right,不用特別去聲明成員調(diào)用此函數(shù)
	//Student::Print();//error,非靜態(tài)只能用對象來調(diào)用,非static中,有this指針,必須通過對象來調(diào)用
}

?總結(jié):

一個常規(guī)的成員函數(shù)聲明描述了三件在邏輯上相互不同的事情:

  • 該函數(shù)能訪問類聲明的私用部分。
  • 該函數(shù)位于類的作用域之中。
  • 該函數(shù)必須由一個對象去激活(有一個this指針)。

將一個函數(shù)聲明為友元可以使它只具有第一種性質(zhì)。

將一個函數(shù)聲明為static可以使它只具有第一種和第二種性質(zhì)。文章來源地址http://www.zghlxwxcb.cn/news/detail-408552.html

到了這里,關于C++靜態(tài)成員(static)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Java 基礎進階篇(一)——— static 靜態(tài)關鍵字與單例模式

    Java 基礎進階篇(一)——— static 靜態(tài)關鍵字與單例模式

    static:代表靜態(tài)的意思,可以修飾成員變量,可以修飾成員方法。 static 修飾方法之后稱為 靜態(tài)方法(類方法) ,修飾成員變量之后稱為 靜態(tài)成員變量(類變量) 。 static 修飾后的成員變量, 可以被類的所有對象共享 (訪問、修改) 。 靜態(tài)成員變量 實例成員變量 概述 有

    2024年02月01日
    瀏覽(48)
  • C++—static關鍵字詳解

    C++的static有兩種用法:面向過程程序設計中的static和面向?qū)ο蟪绦蛟O計中的static。前者應用于普通變量和函數(shù),不涉及類;后者主要說明static在類中的作用。 靜態(tài)全局變量有以下特點: 1、該變量在全局數(shù)據(jù)區(qū)分配內(nèi)存; 2、未經(jīng)初始化的靜態(tài)全局變量會被程序自動初始化為

    2024年02月15日
    瀏覽(23)
  • C++ -- 學習系列 static 關鍵字的使用

    C++ -- 學習系列 static 關鍵字的使用

    static 是 C++ 中常用的,被 static 修飾的變量只會在 靜態(tài)存儲區(qū) (常量數(shù)據(jù)也存放在這里) 被分配一次內(nèi)存,生命周期與整個程序一樣,隨著程序的消亡而消亡。 1. 在文件中定義的 靜態(tài)全局變量 2. 在函數(shù)中定義的靜態(tài)變量 3. 類的靜態(tài)成員變量 4. 靜態(tài)類對象 5. 類的靜

    2024年02月09日
    瀏覽(22)
  • 【C++】static 關鍵字的特性 與 問題

    聲明為 static的類成員 稱為 類的靜態(tài)成員 用 static 修飾的成員變量 ,稱之為 靜態(tài)成員變量 ; 用 static 修飾的成員函數(shù) ,稱之為 靜態(tài)成員函數(shù) 。 靜態(tài)成員變量 一定要在 類外進行初始化 。 下面一段代碼證明 上述定義: 輸出結(jié)果: 從代碼可以看出,靜態(tài)成員變量需要在 類

    2024年02月14日
    瀏覽(60)
  • [開發(fā)語言][c++]:Static關鍵字和全局變量

    [開發(fā)語言][c++]:Static關鍵字和全局變量

    寫在前面: 如果您只是想回顧或了解一下static和全局變量的異同點,那么下面的總結(jié)將滿足您的需求。 如果您是一位初學者或?qū)Χ叩氖褂媚@鈨煽?,建議您讀完該篇文章,相信這一篇將解答完您對于static以及全局變量的所有疑惑。 如有問題或建議歡迎評論 or 私信

    2024年01月20日
    瀏覽(46)
  • 【學習筆記】C++ 中 static 關鍵字的作用

    【學習筆記】C++ 中 static 關鍵字的作用

    在 C/C++ 中, static 在不同的應用場景下,有不同的作用,這里總結(jié)一下,避免在使用時弄混。 我按照以下的邏輯來分類 static 的作用場景 static 作用在變量上 static 作用在全局變量上:限制全局變量在本文件上 static 作用在局部變量上:即使離開變量作用域,也保存變量

    2024年02月09日
    瀏覽(119)
  • 在C++和C中static關鍵字的用法,在C++和C中const關鍵字的用法

    1、在C++和C中static的用法 答:static表示存儲類型,修飾數(shù)據(jù)類型。在C語言中,static修飾局部變量,內(nèi)存分配在靜態(tài)區(qū),生命周期延長,作用域不變。static修飾全局變量,內(nèi)存分配在靜態(tài)區(qū),作用域被局限于本文件,不能被extern引用。static修飾函數(shù),不能被exter

    2024年02月10日
    瀏覽(21)
  • 重學C++系列之const與static關鍵字分析

    重學C++系列之const與static關鍵字分析

    ? ? ? ? 本篇幅講解const與static,主要圍繞在類的范圍內(nèi)敘述,包括作用和使用場景等。 ? ? ? ? 1、const修飾的成員變量,成員變量初始化后不能再修改。 ? ? ? ? 2、const修飾的成員函數(shù),成員函數(shù)不可以修改成員變量,也不能間接修改。 ? ? ? ? 3、static修飾的成員

    2024年02月15日
    瀏覽(23)
  • 【C++】const、static關鍵字和構造函數(shù)初始化

    【C++】const、static關鍵字和構造函數(shù)初始化

    ??個人主頁?? ?個人專欄——C++學習? ??點擊關注??一起學習C語言???? 目錄 1. const修飾成員函數(shù) 1.1 語法格式 1.2 權限放大縮小 1.3 思考 1.4 解答 2. 再談構造函數(shù) 2.1 構造函數(shù)體賦值 2.2 初始化列表 2.3 explicit 3. static成員 3.1 靜態(tài)變量 3.2 靜態(tài)函數(shù) 3.3?靜態(tài)成員變量

    2024年02月19日
    瀏覽(21)
  • C/C++ static關鍵字詳解(最全解析,static是什么,static如何使用,static的常考面試題)

    C/C++ static關鍵字詳解(最全解析,static是什么,static如何使用,static的??济嬖囶})

    目錄 一、前言 ?二、static是什么? 三、static修飾的對象是什么?? ?四、C 語言中的 static ???static的C用法 ???static的重點概念 ???static修飾局部變量 ???static在修飾局部變量和函數(shù)的作用 ???static修飾全局變量和函數(shù) ??static在修飾全局變量和函數(shù)的作用

    2024年02月05日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包