【C++】類和對象(六)

文章目錄

  • 二、static成員
    • 概念
    • 面試題
    • 一個題目
  • 三、友元
    • 友元函數
      • 說明
    • 友元類
  • 四、內部類(了解)
    • 概念:
    • 注意:
    • 特性:
  • 五、匿名對象

書接上回: 【C++】類和對象(五)隱式類型轉換

二、static成員

01_31 03 12 01

概念

聲明為static的類成員稱為類的靜態成員,用static修飾的成員變量,稱之為靜態成員變量;用static修飾的成員函數,稱之為靜態成員函數。靜態成員變量一定要在類外進行初始化

面試題

實現一個類,計算程序中創建出了多少個類對象。

class A
{
public:A() { ++_scount; }A(const A& t) { ++_scount; }~A() { --_scount; }//static成員函數沒有this指針static int GetACount() { return _scount; }
private://聲明 //靜態成員變量 不是屬于某一個對象,屬于所有對象,屬于整個類static int _scount;
};//定義
int A::_scount = 0;void TestA()
{cout << A::GetACount() << endl;A a1, a2;A a3(a1);cout << A::GetACount() << endl;
}

static 成員變量

使用場景:既想定義成全局的,又想用類封裝起來

static 成員函數

想訪問靜態的成員變量,那就可以提供一個靜態的成員函數

一個題目

02_01 000455

static成員應用
求1+2+3+…+n

思路:使用變長數組創建n個sum對象,借用構造函數 讓構造函數被調用n次 以此累加求和

定義一個sum類,類里面聲明靜態成員變量(相當于就是全局的,屬于整個類)。

三、友元

友元函數

問題:現在嘗試去重載operator<<,然后發現沒辦法將operator<<重載成成員函數。因為cout的輸出流對 象和隱含的this指針在搶占第一個參數的位置。this指針默認是第一個參數也就是左操作數了。但是實際使用 中cout需要是第一個形參對象,才能正常使用。所以要將operator<<重載成全局函數。但又會導致類外沒辦 法訪問成員,此時就需要友元來解決。operator>>同理。

class Date{public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}// d1 << cout; -> d1.operator<<(&d1, cout);  不符合常規調用// 因為成員函數第一個參數一定是隱藏的this,所以d1必須放在<<的左側ostream& operator<<(ostream& _cout){_cout << _year << "-" << _month << "-" << _day << endl;return _cout;}private:int _year;int _month;int _day;};

友元函數可以直接訪問類的私有成員,它是定義在類外部的普通函數,不屬于任何類,如果要成為一個類的朋友就需要在該類內部聲明,聲明時需要加friend關鍵字

class Date
{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}private:int _year;int _month;int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{_cout << d._year << "-" << d._month << "-" << d._day;return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{_cin >> d._year;_cin >> d._month;_cin >> d._day;return _cin;
}
int main()
{Date d;cin >> d;cout << d << endl;return 0;
}

說明

友元函數可訪問類的私有和保護成員,但不是類的成員函數 友元函數不能用const修飾 友元函數可以在類定義的任何地方聲明,不受類訪問限定符限制 一個函數可以是多個類的友元函數 友元函數的調用與普通函數的調用原理相同

友元類

友元類的所有成員函數都可以是另一個類的友元函數,都可以訪問另一個類中的非公有成員。

友元關系是單向的,不具有交換性。

比如上述Time類和Date類,在Time類中聲明Date類為其友元類,那么可以在Date類中直接訪問Time 類的私有成員變量,但想在Time類中訪問Date類中私有的成員變量則不行。

友元關系不能傳遞 如

果B是A的友元,C是B的友元,則不能說明C時A的友元。

友元關系不能繼承。

class Time
{friend class Date;// 聲明日期類為時間類的友元類,則在日期類中就直接訪問Time類中的私有成員變量
public:Time(int hour = 0, int minute = 0, int second = 0): _hour(hour), _minute(minute), _second(second){}private:int _hour;int _minute;int _second;
};class Date
{
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接訪問時間類私有的成員變量_t._hour = hour;_t._minute = minute;_t._second = second;}private:int _year;int _month;int _day;Time _t;
};

四、內部類(了解)

概念:

如果一個類定義在另一個類的內部,這個內部類就叫做內部類。內部類是一個獨立的類,它不屬于外部類,更不能通過外部類的對象去訪問內部類的成員。外部類對內部類沒有任何優越的訪問權限。

注意:

內部類就是外部類的友元類,內部類可以通過外部類的對象參數來訪問外部類中的所有成員。但是外部類不是內部類的友元。

特性:

  1. 內部類可以定義在外部類的public、protected、private都是可以的。
  2. 注意內部類可以直接訪問外部類中的static成員,不需要外部類的對象/類名。
  3. sizeof(外部類)=外部類,和內部類沒有任何關系。
class A
{
public://B這個類受A類的類域的限制class B{private:int _b1;};
private:int _a1;int _a2;
};
int main()
{cout << sizeof(A) << endl;A aa;A::B bb;return 0;
}

五、匿名對象

class A
{
public:A(int a=0):a(_a){cout << "A(int a)" <<endl;}~A(){cout <<"~A()" <<endl;}
private:int _a;
}
class Solution 
{
public:int func(int n) {//...return n;}
};
int main()
{//有名對象A aa1;A aa2(10);//匿名對象//生命周期只在當前一行,,我們可以看到下一行他就會自動調用析構函數A();A(10);//匿名對象在這樣場景下就很好用:Solution sl;sl.func(10);//該匿名對象的誕生只是為了調用Sum_Solution(10)這個函數Solution().func(10);return 0;
}

匿名對象生命周期只有一行,我們可以看到走完匿名對象這一行立馬調用析構函數

在這里插入圖片描述

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

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

相關文章

Xcode 手動添加模擬器

在Xcode中下載iOS模擬器很慢&#xff0c;且經常出現下載失敗&#xff0c;需重新從頭開始下載的問題。現了解Xcode 15 和運行環境是分離的&#xff0c;故闡述一下手動添加模擬器的步驟&#xff1a; 官網下載所需模擬器&#xff1a;https://developer.apple.com/download/all/?…

idea項目推送gitee/github

選擇需要的項目創建本地Git倉庫 添加到暫存區 第一次提交 或者點擊這里 寫備注并commit 推送遠程倉庫 填寫地址 解決上圖警告 右鍵打開項目&#xff0c;輸入 git pull origin master –allow-unrelated-historiesgit push -u origin master -f推送成功 idea項目推送github及克…

怎么用韓語說幫忙更合體,柯橋零基礎韓語培訓

1. **詳細解釋&#xff1a;** - **標準寫法與音譯&#xff1a;** - **??**&#xff08;讀作 dop-da&#xff09;&#xff1a;動詞“幫助”。 - **????**&#xff08;讀作 do-wa-ju-da&#xff09;&#xff1a;動詞“幫忙”&#xff0c;字面意思是“給予幫助”。 - **??…

PMP證書在國內已經泛濫了,大家怎么看?

目前&#xff0c;越來越多的人獲得了PMP證書。自1999年PMP引入中國以來&#xff0c;全國累計PMP考試人數接近60萬人次&#xff0c;通過PMP認證的人數約為42萬人。雖然這個數據看起來很大&#xff0c;但絕對不能說是過多。 首先&#xff0c;PMP在中國并不普遍。根據美國項目管理…

【源碼+文檔+調試講解】災害應急救援平臺

摘 要 災害應急救援平臺的目的是讓使用者可以更方便的將人、設備和場景更立體的連接在一起。能讓用戶以更科幻的方式使用產品&#xff0c;體驗高科技時代帶給人們的方便&#xff0c;同時也能讓用戶體會到與以往常規產品不同的體驗風格。 與安卓&#xff0c;iOS相比較起來&…

linux好用的分屏器byobu

什么是byobu byobu是linux下分屏器工具tmux或screen的包裝器。 安裝 sudo apt-get install byobu 啟動 emaubuntu:~$ byobu配置通知欄 按F9進入Byobu配置菜單導航到切換狀態通知選項&#xff0c;然后按ENTER鍵可以在選中和不選中之間切換選擇要啟用的狀態通知后&#xff…

深度學習項目實例(一)—— 實時AI換臉項目

一、前言 人工智能&#xff08;AI&#xff09;技術的快速發展為各個領域帶來了革命性的變化&#xff0c;其中之一就是人臉識別與圖像處理技術。在這之中&#xff0c;AI換臉技術尤其引人注目。這種技術不僅在娛樂行業中得到廣泛應用&#xff0c;如電影制作、視頻特效等&#xf…

static在C/C++中的作用

C語言中 static 的作用&#xff1a; 文件作用域的全局變量&#xff1a; 當static修飾一個全局變量時&#xff0c;這個變量只在定義它的文件內部可見&#xff0c;不會被其他文件訪問。 靜態局部變量&#xff1a; 在函數內部&#xff0c;static關鍵字確保局部變量的生命周期貫穿整…

目前公認最好用充電寶!四款高性價比充電寶推薦,一文看懂!

當我們在旅行途中&#xff0c;手機和相機等設備必不可少。長時間使用這些設備&#xff0c;電量很容易耗盡。此時&#xff0c;充電寶就能派上用場&#xff0c;讓我們在欣賞美景、記錄美好時光的同時&#xff0c;不再擔心電量不足。特別在假期出游的時候在我們玩的特別盡興的時候…

力扣2815.數組中的最大數對和

力扣2815.數組中的最大數對和 遍歷每個元素 并求其中最大的數字 將每個數字對應的最大元素存在數組中每遍歷到一個新的元素 &#xff0c;將其存在對應的數組位置中 class Solution {public:int maxSum(vector<int>& nums) {vector<int> cnt(10,INT_MIN);int…

【C++】關于虛函數的理解

深入探索C虛函數&#xff1a;原理、應用與實例分析 一、虛函數的原理二、虛函數的應用三、代碼實例分析四、總結 在C面向對象編程的世界里&#xff0c;虛函數&#xff08;Virtual Function&#xff09;扮演著至關重要的角色。它不僅實現了多態性這一核心特性&#xff0c;還使得…

查看linux服務器cpu,硬盤,內存

lscpu 查看cpu 釋義 Architecture: x86_64 // 指定系統架構&#xff0c;這里是 x86_64&#xff0c;表示一個64位系統。 CPU op-mode(s): 32-bit, 64-bit // 指示支持的 CPU 操作模式&#xff0c;顯示了32位和64位兩種模式。 Byte Order: Little…

紅酒與珠寶:璀璨與醇香的奢華交響,雙重誘惑難擋

在璀璨的燈光下&#xff0c;紅酒與珠寶各自閃耀著迷人的光芒&#xff0c;它們如同夜空中的繁星&#xff0c;交相輝映&#xff0c;共同演繹著奢華的雙重誘惑。今天&#xff0c;就讓我們一起走進這個充滿魅力的世界&#xff0c;感受紅酒與珠寶帶來的無盡魅力。 首先&#xff0c;讓…

java中自定義線程池最佳實踐

java中自定義線程池最佳實踐 在現代應用程序中&#xff0c;線程池是一種常用的技術&#xff0c;可以有效管理和復用線程資源&#xff0c;從而提升系統的并發性能和穩定性。本文將詳細介紹自定義線程池的最佳實踐&#xff0c;涵蓋從線程池大小配置、隊列選擇到拒絕策略、任務設…

基于STM32+ESP8266打造智能家居溫濕度監控系統(附源碼接線圖)

摘要: 本文將介紹如何使用STM32單片機、ESP8266 Wi-Fi模塊和Python Flask框架構建一個完整的物聯網系統&#xff0c;實現傳感器數據采集、無線傳輸、云端存儲及Web可視化展示。 關鍵詞: STM32, ESP8266, 傳感器, Flask, 物聯網, 云平臺, 數據可視化 1. 系統概述 本系統以STM…

Spring底層原理之proxyBeanMenthod實例 動態代理 反射 Bean的攔截

proxyBeanMenthod 假設我們要進行一個系統的二次開發 然后第一次開發我們實用的是XML聲明bean 二次開發的時候要用注解 我們如何把bean都加載上來呢 我們首先創建一個全新的配置類 package com.bigdata1421.config;public class SpringConfig32 { } 我們創建一個APP 加載…

Perl語言入門學習讀物

1. PERL 是什么? Perl 最初的設計者為Larry Wall&#xff0c;Perl借取了C、sed、awk、shell scripting以及很多其他程序語言的特性。Perl一般被稱為“實用報表提取語言”(PracticalExtraction andReportLanguage)&#xff0c;有時也被稱做“病態折中垃圾列表器”(Pathologica…

springboot+vue3無感知刷新token實戰

目錄 一、java后端 1、token構造實現類 ①驗證碼方式實現類 ②刷新token方式實現類 2、token相關操作&#xff1a;setCookie ①createToken ②refreshToken 二、前端&#xff08;vue3axios&#xff09; web網站中&#xff0c;前后端交互時&#xff0c;通常使用token機制…

全球最快的 JSON 文件查詢工具

本文字數&#xff1a;1684&#xff1b;估計閱讀時間&#xff1a;5分鐘 審校&#xff1a;莊曉東&#xff08;魏莊&#xff09; 本文在公眾號【ClickHouseInc】首發 介紹 在 ClickHouse&#xff0c;我們熱衷于基準測試和性能優化。所以當我第一次看到 Hacker News 上那篇“查詢大…

代碼隨想錄算法訓練營day31|134.加油站、135. 分發糖果、406.根據身高重建隊列

134.加油站 如下圖所示&#xff1a; 當索引一道2的時候&#xff0c;剩余油量的總量13-6 < 0&#xff0c;這個時候說明以索引0為起點不合適&#xff0c;將起點更新為索引3. 兩點證明&#xff1a; 1.如果我們從藍色段中間選一個點開始&#xff0c;是不是最后sumGas就不小于0…