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

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

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

靜態(tài)成員

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

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

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

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

示例:

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

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

所有對象共享一個函數(shù)
靜態(tài)成員函數(shù)只能訪問靜態(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ù)可以訪問靜態(tài)成員變量
   	//m_b=100,靜態(tài)成員函數(shù)不可以訪問非靜態(tài)成員變量
   	//原因無法區(qū)分到底哪個是對象的m_b;
   }
   static int m_a;//靜態(tài)成員變量
   int m_b;
};
int Person::m_a = 0;
int main()
{
   //1.通過對象訪問
   Person p;
   p.func();
   //2.通過類名訪問
   Person::func();

   system("pause");
   return 0;
}

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

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

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

成員變量和成員函數(shù)分開存儲

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

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

空對象:

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

};
void test01()
{
	Person p;
	//空對象占用內(nèi)存空間為:1
	//C++編譯器會給每個空對象也分配一個字節(jié)空間,是為了區(qū)分空對象占內(nèi)存的位置
	//每個空對象也應(yīng)該有獨一無二的內(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)成員變量 屬于類的對象上
};
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)成員變量 屬于類的對象上
	static int m_b; //靜態(tài)成員變量 不屬于類的對象上
};
void test02()
{
	Person p;
	cout << sizeof(p) << endl;
}
int main()
{
	test02();
}

輸出結(jié)果:4

與第二個對比可知:

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

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

輸出結(jié)果:4

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

this 指針

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

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

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

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

this 指針的用途

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

1.當(dāng)形參和成員變量同名時,可用this指針來區(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.在類的非靜態(tài)成員函數(shù)中返回對象本身,可用 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;
}

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

C++中空指針是可以調(diào)用成員函數(shù),但是也要注意有沒有用到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;
}

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

如下代碼就是一個錯誤代碼

#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指針是一個空指針,所以會報錯

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

#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é)

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

相關(guān)文章

  • 基于C++實現(xiàn)一個簡單的音樂系統(tǒng)

    基于C++實現(xiàn)一個簡單的音樂系統(tǒng)

    C++中的Beep 函數(shù)是一個發(fā)出嗡鳴聲的函數(shù),本文將利用這個函數(shù)實現(xiàn)制作一個簡單的聲音系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • 提升編程能力的C語言技巧總結(jié)

    提升編程能力的C語言技巧總結(jié)

    這篇文章主要為大家總結(jié)了一些C語言技巧的相關(guān)資料,可以幫助大家大大提升編程能力。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • 一篇文章帶你了解C++智能指針詳解

    一篇文章帶你了解C++智能指針詳解

    這篇文章主要介紹了c++ 智能指針基礎(chǔ)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-08-08
  • socket多人聊天程序C語言版(二)

    socket多人聊天程序C語言版(二)

    這篇文章主要為大家詳細(xì)介紹了socket多人聊天程序C語言版第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 淺談C語言Free空指針會怎樣

    淺談C語言Free空指針會怎樣

    在C語言中,使用free函數(shù)釋放一個空指針是安全的,不會引發(fā)任何錯誤或異常,本文就來詳細(xì)的介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • c語言 漢諾塔算法代碼

    c語言 漢諾塔算法代碼

    c語言 漢諾塔算法代碼,需要的朋友可以參考一下
    2013-04-04
  • 深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 一起來看看C語言的預(yù)處理注意點

    一起來看看C語言的預(yù)處理注意點

    這篇文章主要為大家詳細(xì)介紹了C語言的預(yù)處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言 位域詳解及示例代碼

    C語言 位域詳解及示例代碼

    本文主要介紹C語言 位域的知識,這里整理了相關(guān)資料,并附示例代碼及詳解,有興趣的小伙伴可以參考下
    2016-08-08
  • C++實現(xiàn)統(tǒng)計代碼運行時間的示例詳解

    C++實現(xiàn)統(tǒng)計代碼運行時間的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C++一個有趣的小項目——統(tǒng)計代碼運行時間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05

最新評論