c++ 類和對象 —— 下 【復習總結】

1. 深入構造函數

1.1 函數體賦值

前文我們提到,創建對象時,編譯器會調用構造函數給成員變量賦值。但這并不能稱為對對象中成員變量的初始化。因為初始化只能初始化一次,但構造函數體內可以多次賦值。構造函數體中語句只能稱為賦初值

那么,成員變量初始化的地方在哪里?我們不得不引入一個知識:初始化列表

1.2 初始化列表

初始化列表:冒號開始,接著是逗號分隔成員列表,每個“成員變量”后跟一個放括號中的初始值或表達式

class Date
{
private:int _year;int _month;int _day;public:Date(int year, int month, int day)//初始列表:_year(year),_month(month),_day(day)//函數體賦值{}
};

注意事項:

1. 每個成員變量在初始化列表最多出現一次(即只能初始化一次)

2. 類中包含:a.引用成員變量 b.const成員變量 c. 自定義成員函數(且該類沒有默認構造函數)

(a 和 b 是因為要求在定義時必須初始化;c 是因為會自動調用它的默認構造函數)

3. 盡量使用初始化列表初始化,對于自定義類型成員變量,一定會先使用初始化列表初始化

4. 成員變量在類中聲明次序是其在初始化列表中的初始化順序,和它在初始化列表的先后次序無關

class A
{
private:int _a;
public:A(int a): _a(a){}
};class B
{
private:A _ao;   //沒有默認構造函數int& _ret; //引用const int _n; //const
public:B(int a, int ret):_ao(a),_ret(ret),_n(10){}
};

1.3 explicit關鍵字

對于接受單個參數的構造函數,還有類型轉換的作用。

接受單個參數的構造函數:

1. 構造函數只有一個參數

2. 構造函數有多個參數,除第一個參數沒默認值,其他參數都有默認值

3 .全缺省構造函數

但用explicit修飾構造函數,會禁止構造函數的隱式轉換

class Date
{
private:int _year;int _month;int _day;
public://單參數構造函數,有類型轉換的作用//用explicit修飾,禁止類型轉換explicit Date(int year):_year(year){}//有兩個缺省參數,相當于單個參數explicit Date(int year, int month=1, int day=1):_year(year),_month(month),_day(day){}
};

2. static成員

聲明為static的類成員為類的靜態成員,修飾成員變量稱為靜態成員變量;修飾成員函數稱為靜態成員函數。靜態成員變量必須在類外初始化

特性:

1. 靜態成員為所有類對象共享,存放在靜態區

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

3. 靜態成員用 類名::靜態成員 或者 對象.靜態成員 訪問

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

5.靜態成員也是類的成員,受到訪問限定符的限制

3. 友元

友元可以突破類封裝的限制。但友元會增加耦合度,破壞封裝,不宜多用

友元:友元函數友元類

3.1 友元函數

友元函數可以直接訪問類的私有成員,它是定義在類外部的普通函數,需要在類的內部聲明,聲明時要加friend關鍵字

注意事項:

1. 友元函數不是類的成員函數,只是可以訪問類的私有和保護成員

2. 友元函數不能用const修飾

3. 友元函數可以在類定義的任何位置聲明,不受訪問限定符的限制

4. 一個函數可以是多個函數的友元函數

5. 友元函數的調用和普通函數調用相同

適用場景:

//如果想重載operator<<,但無法重載為類成員函數。
//this指針默認是第一個參數也就是左操作數了。
//但是實際使用中cout需要是第一個形參對象,所以要將operator << 重載成全局函數。
// 但類外沒辦法訪問成員,此時就需要友元來解決。operator >> 同理
class Date
{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);
public:Date(int year = 2025, 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;
}

3.2 友元類

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

注意事項:

1. 友元關系單向,不具有交互性

2. 友元關系不能傳遞

3. 友元關系不能繼承

class Time
{//聲明日期類為時間類的友元類,在日期類中可以直接訪問Time類的私有成員變量friend class Date;
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 = 2025, 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;
};

4. 內部類

一個類定義在另一個類的內部,這個內部的類就叫內部類。

它不屬于外部類,不能通過外部類的對象去訪問內部類的成員(外部類對內部類沒有任何超越的訪問權限),但內部類是外部類的友元類,內部類可以通過外部類對象參數訪問外部類中所有成員。

注意事項:

1. 內部類可以定義在外部類的任意地方(如同友元)

2. 內部類可以直接訪問外部類的static成員,不需要外部類的對象/類名

3. sizeof(外部類)= 外部類,相當于內部類不存儲在外部類

class A
{
private:static int a;int b;
public:// B是A的友元class B{public:void fun(const A& i){//不用外部類的對象cout << a << endl;cout << i.b << endl;}};
};
int A::a = 1;

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

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

相關文章

【量化科普】Volatility,波動率

【量化科普】Volatility&#xff0c;波動率 &#x1f680;量化軟件開通 &#x1f680;量化實戰教程 在金融市場中&#xff0c;波動率&#xff08;Volatility&#xff09;是衡量資產價格變動幅度的一個重要指標。它反映了資產價格的穩定性和風險水平。高波動率意味著資產價格…

PCIe(Peripheral Component Interconnect Express)詳解

一、PCIe的定義與核心特性 PCIe&#xff08;外設組件互連高速總線&#xff09;是一種 高速串行點對點通信協議&#xff0c;用于連接計算機內部的高性能外設。它取代了傳統的PCI、PCI-X和AGP總線&#xff0c;憑借其高帶寬、低延遲和可擴展性&#xff0c;成為現代計算機系統的核…

idea 編譯打包nacos2.0.3源碼,生成可執行jar 包常見問題

目錄 問題1 問題2 問題3 問題4 簡單記錄一下nacos2.0.3&#xff0c;編譯打包的步驟&#xff0c;首先下載源碼&#xff0c;免積分下載&#xff1a; nacos源碼&#xff1a; https://download.csdn.net/download/fyihdg/90461118 protoc 安裝包 https://download.csdn.net…

通過 TTL 識別操作系統的原理詳解

TTL 的工作原理 TTL&#xff08;Time to Live&#xff0c;生存時間&#xff09;是網絡中用于控制數據包生命周期的一個關鍵參數。它通過限制數據包在網絡中可以經過的最大路由跳數&#xff08;或最大轉發時間&#xff09;&#xff0c;確保數據包不會在網絡中無休止地轉發。TTL…

總結Solidity 的數據類型

數據類型 在 Solidity 中&#xff0c;類型系統非常豐富&#xff0c;主要分為 值類型&#xff08;Value Types&#xff09;和 引用類型&#xff08;Reference Types&#xff09;。此外&#xff0c;還有一些特殊類型和全局變量。 一.值類型 布爾型&#xff08;bool&#xff09…

Android audio(8)-native音頻服務的啟動與協作(audiopolicyservice和audioflinger)

音頻策略的構建 1、概述 2、AudiopolicyService 2.1 任務 2.2 啟動流程 2.2.1 加載audio_policy.conf&#xff08;xml&#xff09;配置文件 2.2.2 初始化各種音頻流對應的音量調節點 2.2.3 加載audio policy硬件抽象庫 2.2.4設置輸出設備 ps:audiopatch流程簡介 2.2.5打開輸出設…

DeepSeek:從入門到精通

DeepSeek是什么&#xff1f; DeepSeek是一家專注通用人工智能&#xff08;AGI&#xff09;的中國科技公司&#xff0c;主攻大模型研發與應 用。DeepSeek-R1是其開源的推理模型&#xff0c;擅長處理復雜任務且可免費商用。 Deepseek可以做什么&#xff1f; 直接面向用戶或者支持…

【一起來學kubernetes】17、Configmap使用詳解

前言概述核心特性創建 ConfigMap使用 ConfigMap1. **環境變量**2. **Volume 掛載**3. **命令行參數** 更新與熱重載Docker容器中Java服務使用Configmap**一、通過環境變量注入****步驟說明****示例配置** **二、通過 Volume 掛載配置文件****步驟說明****示例配置** **三、動態…

【八股文】從瀏覽器輸入一個url到服務器的流程

1.url解析與DNS解析 瀏覽器解析用戶輸入的URL&#xff0c;提取協議&#xff08;HTTP\HTTPS&#xff09;、域名、端口及路徑等信息 瀏覽器首先檢查本地DNS緩存和系統DNS緩存&#xff0c;若未命中&#xff0c;查詢本地hosts文件 最后遞歸查詢向本地DNS服務器發起請求&#xff…

網絡空間安全(34)安全防御體系

前言 安全防御體系是一個多層次、多維度的系統&#xff0c;旨在保護組織或個人的信息資產免受各種網絡攻擊和威脅。 一、技術層面 網絡邊界防御 防火墻&#xff1a;部署在網絡邊界&#xff0c;通過設定規則允許或阻止特定流量的進出&#xff0c;保護內部網絡不受外部攻擊。入侵…

Linux 入門:權限的認識和學習

目錄 一.shell命令以及運行原理 二.Linux權限的概念 1.Linux下兩種用戶 cannot open directory .: Permission denied 問題 2.Linux權限管理 1).是什么 2).為什么&#xff08;權限角色目標權限屬性&#xff09; 3).文件訪問者的分類&#xff08;角色&#xff09; 4).文…

【筆記】計算機網絡——數據鏈路層

概述 鏈路是從一個結點到相鄰結點的物理路線&#xff0c;數據鏈路則是在鏈路的基礎上增加了一些必要的硬件和軟件實現 數據鏈路層位于物理層和網絡層之間&#xff0c;它的核心任務是在直接相連的節點&#xff08;如相鄰的交換機&#xff0c;路由器&#xff09;之間提供可靠且…

ngx_url_t

定義在 src/core/ngx_inet.h typedef struct {ngx_str_t url;ngx_str_t host;ngx_str_t port_text;ngx_str_t uri;in_port_t port;in_port_t default_port;in_port_t …

搜廣推校招面經五十四

美團推薦算法 一、手撕Transformer的位置編碼 1.1. 位置編碼的作用 Transformer 模型沒有顯式的序列信息&#xff08;如 RNN 的循環結構&#xff09;&#xff0c;因此需要通過位置編碼&#xff08;Positional Encoding&#xff09;為輸入序列中的每個位置添加位置信息。位置…

網絡爬蟲【爬蟲庫urllib】

我叫不三不四&#xff0c;很高興見到大家&#xff0c;歡迎一起學習交流和進步 今天來講一講爬蟲 urllib介紹 Urllib是Python自帶的標準庫&#xff0c;無須安裝&#xff0c;直接引用即可。 Urllib是一個收集幾個模塊來使用URL的軟件包&#xff0c;大致具備以下功能。 ● urlli…

LabVIEW棉花穴播器排種自動監測系統

一、項目背景與行業痛點 1. 農業需求驅動 我國棉花主產區&#xff0c;種植面積常年超250萬公頃&#xff0c;傳統人工播種存在兩大核心問題&#xff1a; 效率瓶頸&#xff1a;人均日播種面積不足0.5公頃&#xff0c;難以匹配規模化種植需求&#xff1b; 精度缺陷&#xff1a;人…

解決diffusers加載stablediffusion模型,輸入prompt總是報錯token數超出clip最大長度限制

1. StableDiffusion1.5 在加載huggingface中的擴散模型時&#xff0c;輸入prompt總是會被報錯超過clip的最大長度限制。 解決方案&#xff1a;使用compel庫 from diffusers import AutoPipelineForText2Image import torch import pdb from compel import Compeldevice torc…

jmeter配件元素

jmeter配件元素 CSV Data Set Config名詞解釋測試場景Recycle on EOF:False配置測試結果 Recycle on EOF:True配置測試結果 Sharing mode:All Threads配置測試結果 Sharing mode:Current thread group配置測試結果 Sharing mode:Current thread配置測試結果 HTTP Header Manage…

Navicat SqlServer 設置自增主鍵

Navicat是一款優秀的數據庫管理工具&#xff0c;可以連接很多類型的數據庫。使用它可以極大的提高工作效率。 Navicat 不能設置SqlServer自增字段&#xff0c;只能通過sql語句來實現 建表時設置 create table <表名> ( <字段1-主鍵> int identity (1,1) primar…

Elasticsearch搜索引擎 3(DSL)

Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;語句來定義查詢條件&#xff0c;其JavaAPI就是在組織DSL條件。 1.DSL查詢 葉子查詢&#xff08;Leaf query clauses&#xff09;&#xff1a;在特定的字段里查詢特定值&#xff0c;屬于簡單…