【C -> Cpp】由C邁向Cpp (6):靜態、友元和內部類

標題:【C -> Cpp】由C邁向Cpp (6):靜態、友元和內部類

@水墨不寫bug


(圖片來源于網絡)


目錄

(一)靜態成員

(二)友元

?(三)內部類

(四)深入理解類和對象、總結


正文開始:?

(一)靜態成員

? ? ? ? C語言中有靜態的概念,比如靜態函數和靜態變量。

靜態變量:存儲在靜態區,隨著主函數的開始而創建并初始化,隨著程序結束而銷毀。選擇創建靜態變量,會使變量的生命周期延長到程序結束。

靜態函數則是不同的概念:靜態函數只能在當前源文件中訪問,不能被其他源文件訪問調用。選擇定義靜態函數的作用是將函數的作用域限制在當前源文件內,并且可以避免與其他源文件中定義的同名函數發生沖突。

? ? ? ? Cpp中,由于新增了類和對象的特性,對靜態變量的處理就有所不同了。

?????????類中是可以創建靜態變量的,由于靜態變量存儲在靜態區,只初始化一次,所以一個類(Class)內部(定義)包含有的靜態變量是可以通過任意一個這個Class創建的對象來訪問的,這也就表明了這個靜態變量是屬于這個類的,而不是單獨屬于某個實例化的對象。

? ? ? ? 如果我們執行下面這一段代碼:

#include<cstdlib>
#include<iostream>
using namespace std;
class A
{public:private:static int _a;int _b;int _c;
};
int main()
{A aa;cout << sizeof(aa) << endl;return 0;
}

?結果可能會讓你驚訝:靜態對象_a不是存儲在對象aa中的!

????????1.靜態成員為所有類對象所共享,不屬于某個具體的對象,存放在靜態區。

(類的成員函數指針也不存放在類內,而是存放在公共的代碼段)

?其次,類靜態對象的定義是在類外部的。

class A
{
public:private:static int _a;int _b;int _c;
};int A::_a = 5;

?????????2. 靜態成員變量必須在類外定義,定義時不添加static關鍵字,類中只是聲明

? ? ? ? ?訪問方式:

? ? ? ? 類靜態成員對象有兩種訪問方式:

? ? ? ? 1)通過實例化的對象訪問;

    A aa;//實例化一個對象aa._a++;//通過對象訪問

? ? ? ? 2)通過類名訪問;

    A::_a++;//直接通過類名訪問

????????3. 靜態成員函數沒有隱藏的this指針,不能訪問任何非靜態成員

>同時就是說:靜態成員函數只可以訪問靜態變量

?4. 靜態成員也是類的成員,受public、protected、private 訪問限定符的限制


(二)友元

? ? ? ? 友元是通過一個關鍵字(friend)來實現的;我們在實現一個類的時候,通常把成員函數定義為共有(public),而把成員變量定義為私有(private)。

????????如果我們在項目中想要通過重載cout來輸出自己的自定義類型對象時,一定會遇到這樣的問題:


ostream& operator<<(const Date d) 
{out << this->_year << " " << this->_month << " " << this->_day;out << endl;return out;
}

? ? ? ? 由于用類對象調用重載后的函數時,參數的順序首先是this,其次是其他的對象。所以調用重載后的cout會十分的別扭,而與常規的邏輯不同:

    cout<<d1;

? ? ? ? ?解決方法就是第一個參數必須是cout,其次是其他參數。由于類內部定義的函數的第一個參數必是this指針,所以這個邏輯正確的函數必須在類外定義。

? ? ? ? 但是由于類外的函數不能訪問類的private的成員函數,所以為了解決這一問題,Cpp就引入“友元”的概念:

? ? ? ? 成為友元的函數可以突破private的限制,直接訪問類的私有成員變量。

????????友元分為:#友元函數和友元類#

?注意:

? ? ? ? 1)友元提供了一種突破封裝的方式,有時提供了便利;

? ? ? ? 2)但是友元會增加耦合度,破壞了封裝,所以友元不宜多用。

????????通過定義友元函數,我們可以寫出邏輯正確的cout重載函數:

ostream& operator<<(ostream& out, const Date d) 
{out << d._year << " " << d._month << " " << d._day;out << endl;return out;
}

?函數的效果:


?(三)內部類

? ? ? ? 什么是內部類?如果一個類,它定義在另一個類的內部,那么這個定義在內部的類就稱為“內部類”。

示例:

class A
{class B{int _c;    };
};

此時,B就是A的內部類。?

內部類也是一個類,只不過他被A的作用域又封裝了一層,想要找到B,則要:

//創建一個類B,需要在A的作用域中去尋找A::B aa;

?內部類是一個獨立的類,它是外部類A的友元類:????????

? ? ? ? 內部類B可以訪問A的私有成員,而A不能訪問B的私有成員。

????????(內部可以訪問外部,而不能反著來)

?其他特性:
????????1. 內部類可以定義在外部類的public、protected、private都是可以的。
????????2. 注意內部類可以直接訪問外部類中的static成員,不需要外部類的對象/類名。
????????3. sizeof(外部類)=外部類,和內部類沒有任何關系。

(四)深入理解類和對象、總結

? ? ? ? 假如將來你要開一家外賣公司,需要打造你的項目,這時你該如何保存信息?

? ? ? ? 創建多個類:外賣騎手,商家,顧客類;

每個類包含的信息(包含的成員變量),擁有的功能(實現的函數)都是最必要的:

騎手:姓名,電話,實時位置信息等;

商家:店名,位置,菜品,價格信息等;

顧客:姓名,電話,住址信息等;

????????這些成員變量就是根據實際需求來定義的。對于這些類,他們之間也會有交互,需要實現交互函數,這就是后話了。


? ? ? ? 類和對象是一種能夠將現實生活中的關系相對較好的表現出來,這也是面向對象編程的實際需求。

? ? ? ? 與此同時,現實生活中的實體計算機并不認識現實生活中的對象,計算機只認識二進制格式的數據。如果想要讓計算機認識現實生活中的實體,用戶必須通過某種面向對象的語言,對實體進行描述,然后通過編寫程序,創建對象后計算機才可以認識。

考慮顯示需求:

? ? ? ? 對于商家,他們都有一個特征:他們是賣東西的,需要客戶。

? ? ? ? 對于騎手,他們的特征是:他們是接單送單的,需要商家的訂單。

? ? ? ? 對于顧客,他們的特征是:他們是需要產品的,要在商家那里消費的,需要商家。

????????據此,我們可以把所有的商家抽象為一類,創建一個商家類;把所有的騎手抽象為一個類,創建一個騎手類;把所有的顧客抽象為一個類,創建一個顧客類。

????????類是對象的抽象,對象是類的實際體現。

? ? ? ? 類的屬性和功能來源于生活中的實際需要。


?

用一張圖總結:

?


完~

未經作者同意禁止轉載?

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

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

相關文章

生產性服務業與生活性服務業如何區分

服務業的興旺發達是現代經濟的顯著特征&#xff0c;是經濟社會發展的必然趨勢&#xff0c;是衡量經濟發展現代化、國際化、高端化的重要標志。生產性服務業和生活性服務業是服務業的重要組成部分&#xff0c;是當前中國經濟最具活力的產業&#xff0c;也是未來經濟發展最具潛力…

2024OD機試卷-解密犯罪時間 (java\python\c++)

題目:解密犯罪時間 題目描述 警察在偵破一個案件時,得到了線人給出的可能犯罪時間,形如 “HH:MM” 表示的時刻。 根據警察和線人的約定,為了隱蔽,該時間是修改過的,解密規則為:利用當前出現過的數字,構造下一個距離 當前時間 最近的時刻,則該時間為可能的犯罪時間。…

為pytorch前向和反向的Tensor生成描述性統計

為pytorch前向和反向的Tensor生成描述性統計 代碼 在調試Megatron-DeepSpeed的精度時&#xff0c;我們希望對比每一層前向和反向傳播的輸入輸出誤差。然而&#xff0c;由于數據量過大&#xff0c;直接保存所有數據不太現實。因此&#xff0c;我們生成了輸入輸出tensor的描述性統…

有哪些好用的3dMax大神插件?

有哪些好用的3dMax大神插件&#xff1f; Mesh Insert 3DMAX網格插入插件Mesh Insert&#xff0c;在選擇的面上安門窗、打螺絲、挖洞、插入眼耳口鼻及其它網格模型等可以分分鐘搞定&#xff01;它通過將面選擇替換為庫中的資源來加快建模過程。非常適合硬網格和有機建模&#xf…

Go 一個類型轉換工具包strconv包

Go 語言的 strconv 包提供了用于基本數據類型之間轉換的函數&#xff0c;包括字符串到其他基本類型的轉換&#xff0c;以及其他基本類型到字符串的轉換。 字符串轉換為基本數據類型 strconv.Atoi&#xff1a;將字符串轉換為 intstrconv.ParseBool&#xff1a;將字符串轉換為 b…

iOS ------ 多線程基礎

一&#xff0c;進程和線程 1&#xff0c;進程 定義&#xff1a; 進程是指在系統中正在運行的一個應用程序每個進程之間是獨立的&#xff0c;每個進程均運行在其專有的且受保護的內存進程是系統進行資源分配和調度的一個獨立單位 補充&#xff1a;iOS系統是相對封閉的系統&a…

SQL中的LAG函數與LEAD函數用法

LAG&#xff1a;函數用于獲取結果集中當前行之前的某一行的值 LAG (scalar_expression [,offset] [,default]) OVER ([partition_by_clause ] order_by_clause ) -----漢字解釋 LAG (字段 [,偏移量默認為1] [,如果沒有值時候默認值]) OVER ( [ partition_by 字段 ] order_by 字…

服務網格 SolarMesh v1.13 重磅發布

SolarMesh是行云創新推出的流量治理平臺&#xff0c;它基于Istio&#xff0c;為部署在K8s集群上的應用提供全面的流量治理能力。 在之前的版本中&#xff0c;SolarMesh提供的能力有&#xff1a;流量視圖&#xff0c;流量控制策略批量配置&#xff0c;API級別的流量數據采集和展…

【上海大學計算機組成原理實驗報告】五、機器語言程序實驗

一、實驗目的 理解計算機執行程序的實際過程。 學習編制機器語言簡單程序的方法。 二、實驗原理 根據實驗指導書的相關內容&#xff0c;指令的形式化表示是指采用一種規范化的符號系統&#xff0c;以更清晰、精確地描述和表示指令的邏輯功能和操作步驟。 匯編是一種編程語言…

MM模塊學習二 (供應商,物料后臺相關配置)

公司代碼配置 新建條目&#xff08;只是建了一個名字出來&#xff0c;后面很多表都是沒有得&#xff09; 接下來定義公司代碼&#xff1a; 公司代碼復制完成&#xff08;后續修改交給財務顧問去做&#xff09; 復制工廠&#xff1a; 復制工廠完成&#xff1a; 修改復制過去的工…

Linux服務器lvm磁盤管理fdisk和df磁盤大小不同修改

服務器端由于硬盤是通過VCenter原來100G磁盤復制的虛擬機,復制完成后,原來100G的磁盤通過選擇 磁盤重新復制出150G的磁盤,開機后發現還是原來的100G的磁盤,通過fdisk -l 查看有個sdb是150G, 但是已經劃轉的lvm盤只有100G, 通過df查看也是原來的100G: pvs查看pv里也是10…

用c++實現快速排序、最大子段和問題

6.2.2 快速排序 【問題】快速排序(quick sort)的分治策略如下&#xff08;圖6-5)。 (1)劃分&#xff1a;&#xff08;選定一個記錄作為軸值&#xff0c;以軸值為基準將整個序列劃分為兩個子序列&#xff0c;軸值的位置在劃分的過程中確定&#xff0c;并且左側子序列的所有記錄…

26 分鐘驚訝世界,GPT-4o 引領未來人機交互

前言 原文鏈接&#xff1a;OpenAI最新模型——GPT-4o&#xff0c;實時語音視頻交互&#xff0c;未來人機交互近在眼前 - Kaiho小站 北京時間 5 月 14 日凌晨&#xff0c;OpenAI 發布新一代模型——GPT-4o&#xff0c;僅在 ChatGPT 面世 17 個月后&#xff0c;OpenAI 再次通過…

qt的udp通訊

QString mylocalip; const QList interfaces QNetworkInterface::allInterfaces(); foreach(QNetworkInterface ip, interfaces) { if (ip.humanReadableName() QStringLiteral(“以太網”)) { //if (ip.type() QNetworkInterface::Ethernet) { const QList iplist ip.addr…

【EasyX】快速入門——靜態圖形篇

1.基本說明 EasyX 是針對 C 的圖形庫&#xff0c;可以幫助 C/C 初學者快速上手圖形和游戲編程。 比如&#xff0c;可以基于 EasyX 圖形庫很快的用幾何圖形畫一個房子&#xff0c;或者一輛移動的小車&#xff0c;可以編寫俄羅斯方塊、貪吃蛇、黑白棋等小游戲&#xff0c;可以練…

Go 注釋生成 api文檔

在 Go 語言中&#xff0c;通常會使用 godoc 工具來從注釋中生成 API 文檔。godoc 是 Go 官方提供的文檔生成工具&#xff0c;它可以解析 Go 源代碼中的注釋&#xff0c;并生成在線的、可交互的文檔。 為了使用 godoc 生成 API 文檔&#xff0c;你需要遵循一些特定的注釋格式。…

使用VMware或VirtualBox安裝eNSP Pro并使用CRT連接設備

文章目錄 使用Oracle Virtual Box安裝eNSP Pro創建虛擬機配置網卡配置帶外管理網絡 使用VMware Workstation安裝eNSP Pro轉換文件格式及虛擬磁盤模式配置網卡創建虛擬機配置使用CRT連接管理設備 前一段時間是開放了eNSP Pro的賬號權限&#xff0c;但是在寫博客時&#xff0c;權…

2024OD機試卷-字符串分割(二) (java\python\c++)

題目:字符串分割(二) 題目描述 給定一個非空字符串S,其被N個‘-’分隔成N+1的子串,給定正整數K,要求除第一個子串外,其余的子串每K個字符組成新的子串,并用‘-’分隔。 對于新組成的每一個子串,如果它含有的小寫字母比大寫字母多,則將這個子串的所有 大寫字母轉換為小…

27.哀家要長腦子了!

目錄 1.316. 去除重復字母 - 力扣&#xff08;LeetCode&#xff09; 2. 1209. 刪除字符串中的所有相鄰重復項 II - 力扣&#xff08;LeetCode 哎喲 煩死了 剛剛不小心退出又沒保存 又要寫一遍 煩死了 最近刷題不得勁啊 感覺這腦子沒長一點 1.316. 去除重復字母 - 力扣&am…

(實測驗證)【移遠EC800M-CN 】GNSS功能打開和關閉關閉步驟驗證

引言 本文章使用自研“超小體積TTL轉4GGPS集成模塊”進行實測驗證&#xff1b; 一、打開GNSS功能 步驟一、通過 ATQGPSCFG 配置 GNSS 參數 &#xff08;1&#xff09;該命令用于查詢和配置 GNSS 不同的設置&#xff0c;包括 NMEA 語句輸出端口、NMEA 語句的輸出類型等。 1.1…