最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++靜態(tài)成員函數(shù)和this指針詳解

 更新時(shí)間:2022年01月07日 15:19:38   作者:c語(yǔ)言宇  
這篇文章主要為大家介紹了C++靜態(tài)成員函數(shù)和this指針,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

靜態(tài)成員

靜態(tài)成員就是在成員變量和成員函數(shù)前加上關(guān)鍵字static,稱(chēng)為靜態(tài)成員

靜態(tài)成員分為:

1.靜態(tài)成員變量

 所有對(duì)象共享同一份數(shù)據(jù)
 在編譯階段分配內(nèi)存
 類(lèi)內(nèi)聲明,類(lèi)外初始化

示例:

#include<iostream>
using namespace std;
class Person
{
public:
   static int m; // 所有對(duì)象共享同一份數(shù)據(jù)
};
int Person::m = 0;// 類(lèi)內(nèi)聲明,類(lèi)外初始化

2.靜態(tài)成員函數(shù)

所有對(duì)象共享一個(gè)函數(shù)
靜態(tài)成員函數(shù)只能訪問(wèn)靜態(tài)成員變量
#include<iostream>
using namespace std;
class Person
{
public:
   static void func()
   {
   	cout << "static void func調(diào)用" << endl;
   	m_a = 100;//靜態(tài)成員函數(shù)可以訪問(wèn)靜態(tài)成員變量
   	//m_b=100,靜態(tài)成員函數(shù)不可以訪問(wèn)非靜態(tài)成員變量
   	//原因無(wú)法區(qū)分到底哪個(gè)是對(duì)象的m_b;
   }
   static int m_a;//靜態(tài)成員變量
   int m_b;
};
int Person::m_a = 0;
int main()
{
   //1.通過(guò)對(duì)象訪問(wèn)
   Person p;
   p.func();
   //2.通過(guò)類(lèi)名訪問(wèn)
   Person::func();

   system("pause");
   return 0;
}

靜態(tài)成員函數(shù)可以訪問(wèn)靜態(tài)成員變量

靜態(tài)成員函數(shù)不可以訪問(wèn)非靜態(tài)成員變量

私有權(quán)限的靜態(tài)成員函數(shù),也是訪問(wèn)不到的

成員變量和成員函數(shù)分開(kāi)存儲(chǔ)

在C++中,類(lèi)內(nèi)的成員變量和成員函數(shù)分開(kāi)存儲(chǔ)

只有非靜態(tài)成員變量才屬于類(lèi)的對(duì)象上

空對(duì)象:

#include<iostream>
using namespace std;
class Person
{

};
void test01()
{
	Person p;
	//空對(duì)象占用內(nèi)存空間為:1
	//C++編譯器會(huì)給每個(gè)空對(duì)象也分配一個(gè)字節(jié)空間,是為了區(qū)分空對(duì)象占內(nèi)存的位置
	//每個(gè)空對(duì)象也應(yīng)該有獨(dú)一無(wú)二的內(nèi)存地址
	cout << sizeof(p) << endl;
}
int main()
{
	test01();
	return 0;
}

輸出結(jié)果:1

#include<iostream>
using namespace std;
class Person
{
	int m_a;//非靜態(tài)成員變量 屬于類(lèi)的對(duì)象上
};
void test02()
{
	Person p;
	cout << sizeof(p) << endl;
}
int main()
{
	test02();
}

輸出結(jié)果:4

#include<iostream>
using namespace std;
class Person
{
	int m_a;//非靜態(tài)成員變量 屬于類(lèi)的對(duì)象上
	static int m_b; //靜態(tài)成員變量 不屬于類(lèi)的對(duì)象上
};
void test02()
{
	Person p;
	cout << sizeof(p) << endl;
}
int main()
{
	test02();
}

輸出結(jié)果:4

與第二個(gè)對(duì)比可知:

靜態(tài)成員變量 不屬于類(lèi)的對(duì)象上

#include<iostream>
using namespace std;
class Person
{
	int m_a;//非靜態(tài)成員變量 屬于類(lèi)的對(duì)象上
	static int m_b; //靜態(tài)成員變量 不屬于類(lèi)的對(duì)象上
	void func() {}//非靜態(tài)成員函數(shù) 不屬于類(lèi)的對(duì)象上
	static void func2() {} //靜態(tài)成員函數(shù)也不會(huì)屬于 類(lèi)的對(duì)象上
};
 int Person::m_b = 0;
void test02()
{
	Person p;
	cout << sizeof(p) << endl;
}
int main()
{
	test02();
}

輸出結(jié)果:4

結(jié)論:只有非靜態(tài)成員變量才屬于類(lèi)的對(duì)象上

this 指針

每一個(gè)非靜態(tài)成員函數(shù)只會(huì)誕生一份函數(shù)實(shí)例,也就是說(shuō)多個(gè)同類(lèi)型的對(duì)象會(huì)共用一塊代碼

那么問(wèn)題是:這塊代碼是如何區(qū)分是哪個(gè)對(duì)象調(diào)用自己的呢?

C++通過(guò)提供的特殊的對(duì)象指針,this指針,解決上述問(wèn)題,this 指針指向被調(diào)用的成員函數(shù)所屬的對(duì)象,通俗的說(shuō),誰(shuí)調(diào)用它,this就指向誰(shuí)

this 指針是所有成員函數(shù)的隱含參數(shù)嗎,不需要定義,可直接使用

this 指針的用途

1.當(dāng)形參和成員變量同名時(shí),可用this指針來(lái)區(qū)分
2.在類(lèi)的非靜態(tài)成員函數(shù)中返回對(duì)象本身,可用 return  *this 

1.當(dāng)形參和成員變量同名時(shí),可用this指針來(lái)區(qū)分

#include<iostream>
using namespace std;
class Person
{
public:
	void func(int age)
	{
		this->age = age;  //
	}
	int age;
};
int main()
{
	Person p;
	p.func(18);
	cout << p.age << endl;
	system("pause");
	return 0;
}

2.在類(lèi)的非靜態(tài)成員函數(shù)中返回對(duì)象本身,可用 return *this

#include<iostream>
using namespace std;
class Person
{
public:
	Person& func(Person&p)
	{
		this->age += p.age;
		return *this;
	}
	int age;
};
int main()
{
	Person p;
	p.age = 10;
	//鏈?zhǔn)骄幊趟枷?
	p.func(p).func(p).func(p);
	cout << p.age << endl;
	system("pause");
	return 0;
}

空指針訪問(wèn)成員函數(shù)

C++中空指針是可以調(diào)用成員函數(shù),但是也要注意有沒(méi)有用到this指針

如果用到this指針,需要加以判斷保證代碼的健壯性

#include<iostream>
using namespace std;
class Person
{
public:
	void ShowPersonclass()
	{
		cout << "調(diào)用ShowPerclass()函數(shù)" << endl;
	}
};
int main()
{
	Person* p = NULL;
	p->ShowPersonclass();
	system("pause");
	return 0;
}

通過(guò)空指針p是可以訪問(wèn)到成員函數(shù)(不帶this指針的成員函數(shù))

如下代碼就是一個(gè)錯(cuò)誤代碼

#include<iostream>
using namespace std;
class Person
{
public:
	void ShowPersonname()
	{
		cout << m_name << endl;  //此處出現(xiàn)了this指針
	}
	int m_name;
};
int main()
{
	Person* p = NULL;
	p->ShowPersonname();
	system("pause");
	return 0;
}

解析:

此處出現(xiàn)了this指針

cout << m_name << endl;

相當(dāng)于

cout <<this -> m_name << endl;

而this指針是一個(gè)空指針,所以會(huì)報(bào)錯(cuò)

為了增加代碼的健壯性,我們因該做出如下改動(dòng)

#include<iostream>
using namespace std;
class Person
{
public:
	void ShowPersonname()
	{
		if (this == NULL)  //在此判斷this是否是空指針
			return;
		cout << m_name << endl;
	}
	int m_name;
};
int main()
{
	Person* p = NULL;
	p->ShowPersonname();
	system("pause");
	return 0;
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • wxWidgets實(shí)現(xiàn)無(wú)標(biāo)題欄窗口拖動(dòng)效果

    wxWidgets實(shí)現(xiàn)無(wú)標(biāo)題欄窗口拖動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了wxWidgets實(shí)現(xiàn)無(wú)標(biāo)題欄窗口拖動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C++?函數(shù)重載背后的原理

    C++?函數(shù)重載背后的原理

    這篇文章主要介紹了C++?函數(shù)重載背后的原理,我們不僅僅需要學(xué)會(huì)重載的使用,更要了解C++為什么支持函數(shù)重載,下面我們一起進(jìn)入文章學(xué)習(xí)該內(nèi)容吧
    2022-05-05
  • 一波C語(yǔ)言字符數(shù)組實(shí)用技巧集錦

    一波C語(yǔ)言字符數(shù)組實(shí)用技巧集錦

    這篇文章主要介紹了一波C語(yǔ)言字符數(shù)組實(shí)用技巧集錦,包括許多字符的轉(zhuǎn)換與提取等基本操作示例,需要的朋友可以參考下
    2016-04-04
  • C++實(shí)現(xiàn)簡(jiǎn)單的希爾排序Shell Sort實(shí)例

    C++實(shí)現(xiàn)簡(jiǎn)單的希爾排序Shell Sort實(shí)例

    這篇文章主要介紹了C++實(shí)現(xiàn)簡(jiǎn)單的希爾排序Shell Sort實(shí)例,對(duì)于正在學(xué)習(xí)算法的朋友很有借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • 用C編寫(xiě)一個(gè)送給女朋友的情人節(jié)小程序 可愛(ài)!

    用C編寫(xiě)一個(gè)送給女朋友的情人節(jié)小程序 可愛(ài)!

    非??蓯?ài)的情人節(jié)小程序!文章為大家分享了用C編寫(xiě)一個(gè)送給女朋友的小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Qt實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的示例詳解

    Qt實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Qt實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • C++ 轉(zhuǎn)換函數(shù)用法案例詳解

    C++ 轉(zhuǎn)換函數(shù)用法案例詳解

    這篇文章主要介紹了C++ 轉(zhuǎn)換函數(shù)用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言?struct結(jié)構(gòu)體超詳細(xì)講解

    C語(yǔ)言?struct結(jié)構(gòu)體超詳細(xì)講解

    C語(yǔ)言中,結(jié)構(gòu)體類(lèi)型屬于一種構(gòu)造類(lèi)型(其他的構(gòu)造類(lèi)型還有:數(shù)組類(lèi)型,聯(lián)合類(lèi)型),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • C++泛型編程基本概念詳解

    C++泛型編程基本概念詳解

    這一篇介紹一下 C++ 編程中與面向?qū)ο蟛⒘械牧硪淮蠓种А盒途幊?,這一篇主要介紹函數(shù)模板、類(lèi)模板和成員模板三大部分,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言常用占位符的使用小結(jié)

    C語(yǔ)言常用占位符的使用小結(jié)

    占位符是一種用于格式化輸出的特殊字符,通常用于 printf() 等輸出函數(shù)中,本文主要介紹了C語(yǔ)言常用占位符的使用小結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

西峡县| 长宁区| 苏尼特右旗| 潮州市| 延津县| 湛江市| 鄂温| 南宫市| 古丈县| 大姚县| 西城区| 冀州市| 永胜县| 鲜城| 运城市| 洛阳市| 太和县| 湘潭县| 金昌市| 泉州市| 乌拉特前旗| 台州市| 新兴县| 藁城市| 奉节县| 会昌县| 乳源| 庆安县| 玛曲县| 建阳市| 陆河县| 鹤岗市| 搜索| 宜君县| 两当县| 武汉市| 文安县| 湖州市| 昌乐县| 衡山县| 醴陵市|