網站首頁 編程語言 正文
靜態成員
靜態成員就是在成員變量和成員函數前加上關鍵字static,稱為靜態成員
靜態成員分為:
1.靜態成員變量
所有對象共享同一份數據 在編譯階段分配內存 類內聲明,類外初始化
示例:
#include<iostream> using namespace std; class Person { public: static int m; // 所有對象共享同一份數據 }; int Person::m = 0;// 類內聲明,類外初始化
2.靜態成員函數
所有對象共享一個函數 靜態成員函數只能訪問靜態成員變量
#include<iostream> using namespace std; class Person { public: static void func() { cout << "static void func調用" << endl; m_a = 100;//靜態成員函數可以訪問靜態成員變量 //m_b=100,靜態成員函數不可以訪問非靜態成員變量 //原因無法區分到底哪個是對象的m_b; } static int m_a;//靜態成員變量 int m_b; }; int Person::m_a = 0; int main() { //1.通過對象訪問 Person p; p.func(); //2.通過類名訪問 Person::func(); system("pause"); return 0; }
靜態成員函數可以訪問靜態成員變量
靜態成員函數不可以訪問非靜態成員變量
私有權限的靜態成員函數,也是訪問不到的
成員變量和成員函數分開存儲
在C++中,類內的成員變量和成員函數分開存儲
只有非靜態成員變量才屬于類的對象上
空對象:
#include<iostream> using namespace std; class Person { }; void test01() { Person p; //空對象占用內存空間為:1 //C++編譯器會給每個空對象也分配一個字節空間,是為了區分空對象占內存的位置 //每個空對象也應該有獨一無二的內存地址 cout << sizeof(p) << endl; } int main() { test01(); return 0; }
輸出結果:1
#include<iostream> using namespace std; class Person { int m_a;//非靜態成員變量 屬于類的對象上 }; void test02() { Person p; cout << sizeof(p) << endl; } int main() { test02(); }
輸出結果:4
#include<iostream> using namespace std; class Person { int m_a;//非靜態成員變量 屬于類的對象上 static int m_b; //靜態成員變量 不屬于類的對象上 }; void test02() { Person p; cout << sizeof(p) << endl; } int main() { test02(); }
輸出結果:4
與第二個對比可知:
靜態成員變量 不屬于類的對象上
#include<iostream> using namespace std; class Person { int m_a;//非靜態成員變量 屬于類的對象上 static int m_b; //靜態成員變量 不屬于類的對象上 void func() {}//非靜態成員函數 不屬于類的對象上 static void func2() {} //靜態成員函數也不會屬于 類的對象上 }; int Person::m_b = 0; void test02() { Person p; cout << sizeof(p) << endl; } int main() { test02(); }
輸出結果:4
結論:只有非靜態成員變量才屬于類的對象上
this 指針
每一個非靜態成員函數只會誕生一份函數實例,也就是說多個同類型的對象會共用一塊代碼
那么問題是:這塊代碼是如何區分是哪個對象調用自己的呢?
C++通過提供的特殊的對象指針,this指針,解決上述問題,this 指針指向被調用的成員函數所屬的對象,通俗的說,誰調用它,this就指向誰
this 指針是所有成員函數的隱含參數嗎,不需要定義,可直接使用
this 指針的用途
1.當形參和成員變量同名時,可用this指針來區分 2.在類的非靜態成員函數中返回對象本身,可用 return *this
1.當形參和成員變量同名時,可用this指針來區分
#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.在類的非靜態成員函數中返回對象本身,可用 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; //鏈式編程思想 p.func(p).func(p).func(p); cout << p.age << endl; system("pause"); return 0; }
空指針訪問成員函數
C++中空指針是可以調用成員函數,但是也要注意有沒有用到this指針
如果用到this指針,需要加以判斷保證代碼的健壯性
#include<iostream> using namespace std; class Person { public: void ShowPersonclass() { cout << "調用ShowPerclass()函數" << endl; } }; int main() { Person* p = NULL; p->ShowPersonclass(); system("pause"); return 0; }
通過空指針p是可以訪問到成員函數(不帶this指針的成員函數)
如下代碼就是一個錯誤代碼
#include<iostream> using namespace std; class Person { public: void ShowPersonname() { cout << m_name << endl; //此處出現了this指針 } int m_name; }; int main() { Person* p = NULL; p->ShowPersonname(); system("pause"); return 0; }
解析:
此處出現了this指針
cout << m_name << endl;
相當于
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; }
總結
原文鏈接:https://blog.csdn.net/m0_61705102/article/details/122196956
相關推薦
- 2023-05-03 C++11學習之包裝器解析_C 語言
- 2022-07-09 android開機自動啟動app的解決方法_Android
- 2022-05-22 使用Redis實現點贊取消點贊的詳細代碼_Redis
- 2022-10-17 在?C#?中使用?Span<T>?和?Memory<T>?編寫高性能代碼的詳
- 2022-08-14 Shell腳本實現監測文件變化的示例詳解_linux shell
- 2022-02-22 Element-UI二次封裝實現TreeSelect 樹形下拉選擇組件
- 2022-08-01 C語言深入探索遞歸的特點_C 語言
- 2022-04-02 Docker鏡像發布到Docker?Hub的實現方法_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支