初始化列表,變量存儲區域和友元變量

前言

初始化列表是書寫構造函數的一種方式,某些成員變量之只能通過初始化列表進行初始化。另外學習c++不可避免地需要知道什么樣的變量存儲在什么區域當中如棧,堆,靜態區,常量區

初始化列表

書寫格式

書寫上,初始化列表,以冒號開始,以逗號分割的數據成員列表,每個成員變量后面個呢一個放在括號后面的初始值或表達式

如下圖所示給出一個日期類的初始化列表

class Date{
public:Date(int year = 1900,int month = 1,int day = 1):_year(year),_month(month),_day(day){}private:int _year;int _month;int _day;
};

初始化列表有什么作用

1.初始化列表可以代替大部分函數體內賦值

2.某些成員變量只能通過初始化列表初始化

引用成員變量,const成員變量,自定義類型變量(且該類沒有構造函數時)只能在初始化列表中初始化

一些需要注意的點

1.每個成員變量在初始化列表只能出現一次,不能重復定義

2.成員聲明的位置和初始化列表中變量的位置順序相同,因為初始化列表是根據成員定義時的位置一一初始化的

class A
{
public:A(int a):_a1(a),_a2(_a1){}void Print(){cout<<_a1<<" "<<_a2<<endl;}
private:int _a2;int _a1;
}int main()
{A aa(1);aa.Print();
}

這個例子就能很好的體現上述問題,定義的順序和初始化列表的順序不同,所以a1在拷貝構造給a2時還沒有初始化,所以打印出來的應該是1和隨機值

3.初始化列表和函數體內賦值各有優略,比如函數體內賦值可以對malloc進行檢查等等

4.當我們使用初始化列表初始化自定義成員時,如果自定義成員的構造函數沒有缺省值,需要顯式傳參

靜態成員

區塊的分類

這里所說的分類都是虛擬內存,分為棧區,堆區,靜態區(數據段),代碼段(常量區)

靜態成員變量

靜態成員變量在類中聲明時,需要在最開頭加上static關鍵字,靜態成員變量不能夠在類內初始化,只能通過訪問限定符在類外初始化

靜態成員變量存放在靜態區

class Date{
public:Date(int year = 1900,int month = 1,int day = 1):_year(year),_month(month),_day(day){}static int sign;
private:int _year;int _month;int _day;}; 
int Date::sign = 1;

靜態成員變量依然收到private等關鍵字的限制,定義在public中可以用域限定符或者訪問操作符訪問

所有統一個類的對象共用一個靜態成員變量

不能用初始化列表來初始化靜態成員變量,定義只能在類外進行定義,使用域限定符

靜態成員函數

靜態成員函數和靜態成員變量很像,所有同一個類的對象共用,受private關鍵字限制

靜態成員函數沒有this指針,意味著它不能夠調用非靜態成員變量

我們一般喜歡使用靜態成員函數去調用靜態成員變量,配套使用

友元

友元有許多種,但是歸根結底友元的目的是讓私有的成員也能讓其他非成員的函數或者類訪問

比如

#include <iostream>
using namespace std;
class Date{
public:Date(int year = 1900,int month = 1,int day = 1):_year(year),_month(month),_day(day){}friend ostream& operator<<(ostream& out,Date& d);static int sign;
private:int _year;int _month;int _day;}; 
int Date::sign = 1;
ostream& operator<<(ostream& out,Date& d)
{out<<d._year<<" "<<d._month<<" "<<d._day;return out;
}int main()
{Date d1(2025,8,5);cout<<d1<<endl;cout<<d1.sign;
}

這樣一個流運算符的重載就只能寫成友元函數,因為他一定有一個ostream對象占用一個參數,而我們又希望他能夠輸出結果,那就只能使用友元了。

書寫的方法很簡單,只需要在類內聲明這個函數,并在最前方加上friend關鍵字即可

內部類天然是外部類的友元

類內可以定義內部類,內部類可以訪問外部類的所有成員,但是外部類無法訪問內部類的私有成員

注意:私有內部類受訪問限定符的限制

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

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

相關文章

excel插入復選框 親測有效

特別說明 1.開始位置是0 2.\u0052是勾選對號 3.\u25A1是不勾選 4.\u0052長度是1 5.\u25A1長度是1 6.漢字長度是1 7.起止位置不能超過索引位置(比如整體長度是6,截止位置最大填寫5) 示例代碼 package com.zycfc.xz.Util.excel;import org.apache.poi.hssf.usermodel.HSSFRichT…

Mac上優雅簡單地使用Git:從入門到高效工作流

Mac上優雅簡單地使用Git&#xff1a;從入門到高效工作流 本文將帶你解鎖在Mac上優雅使用Git的技巧&#xff0c;結合命令行與圖形工具&#xff0c;讓版本控制變得輕松高效&#xff01; 一、為什么Mac是Git的最佳搭檔&#xff1f; 天生支持Unix命令&#xff1a;Git基于Linux開發…

一文了解SOA的紋波

什么是光譜紋波我們在SOA/RSOA/SLD的ASE&#xff08;放大的自發輻射&#xff09;光譜測試中&#xff0c;經常會觀察到光譜中有周期性的變化&#xff0c;通常我們稱之為紋波。在實際應用中&#xff0c;我們大多不希望這些紋波的存在。添加圖片注釋&#xff0c;不超過 140 字&…

ossutil 使用方法

目錄 ossutil 使用方法 1. &#x1f4e4; 上傳文件/文件夾到 OSS 上傳單個文件&#xff1a; 上傳整個文件夾&#xff08;遞歸&#xff09;&#xff1a; 2. &#x1f4e5; 從 OSS 下載文件/文件夾 下載單個文件&#xff1a; 下載整個文件夾&#xff1a; ossutil 使用方法…

從“多、老、舊”到“4i煥新”:品牌官方商城(小程序/官網/APP···)的范式躍遷與增長再想象

全新升級版本「佛羅倫薩小鎮奧萊GO」商城正式上線&#xff01;會員福利加碼 2025年&#xff0c;品牌官方商城應該如何定義&#xff1f;—— 還是一套“電商貨架”&#xff1f; 在商派看來&#xff0c;現如今“品牌官方商城”則需要重新定義&#xff0c;結合不同品牌企業的業務…

WIN QT libsndfile庫編譯及使用

一、概述 libsndfile庫是一個用 C 語言編寫的開源庫&#xff0c;用于讀取和寫入多種音頻文件格式。 環境&#xff1a;QT5.9.9、cmakegui3.23.0、QT的編譯器是minWG32 二、安裝 1、下載libsndfile源碼&#xff0c;連接&#xff1a;https://github.com/libsndfile/libsndfile…

Supergateway教程

Supergateway 是一款專為 MCP&#xff08;Model Context Protocol&#xff09;服務器設計的遠程調試與集成工具&#xff0c;通過 SSE&#xff08;Server-Sent Events&#xff09;或 WebSocket&#xff08;WS&#xff09;協議實現基于 stdio 的服務器與客戶端的高效通信。 Super…

203.移除鏈表元素 707.設計鏈表 206.反轉鏈表

203.移除鏈表元素 Python鏈表節點定義&#xff1a; class ListNode:def __init__(self, val, nextNone):self.val valself.next next 性能分析 鏈表的特性和數組的特性進行一個對比&#xff0c;如圖所示&#xff1a; 203. 移除鏈表元素 這道題就是給大家一個鏈表&#x…

人工智能之數學基礎:利用全概率公式如何將復雜事件轉為簡單事件

本文重點 全概率公式是概率論中的核心工具,用于計算復雜事件的概率。其核心思想是將復雜事件分解為若干互斥且窮盡的簡單事件,通過計算各簡單事件的概率及其條件概率,最終求得目標事件的概率。 全概率公式 全概率公式就是將復雜事件簡單化,定義如下: 如果隨機事件A1,…

飛算JavaAI深度解析:從入門到對比

目錄 一、飛算JavaAI是什么 二、如何注冊和開始使用 三、使用體驗&#xff1a;它能帶來什么 四、與其他大模型的對比分析 五、總結與展望 隨著人工智能技術的飛速發展&#xff0c;大模型在軟件開發領域的應用越來越廣泛。其中&#xff0c;代碼生成工具作為提升開發效率的利…

Flutter各大主流狀態管理框架技術選型分析及具體使用步驟

技術選型決策樹 #mermaid-svg-m5gUL7Cpx4rYV2BQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-m5gUL7Cpx4rYV2BQ .error-icon{fill:#552222;}#mermaid-svg-m5gUL7Cpx4rYV2BQ .error-text{fill:#552222;stroke:#552…

Redis類型之String

1.Redis中的string注意本文以及之后講的redis的類型但是指的value的類型&#xff0c;所有的key都是stringRedis中的字符串&#xff0c;直接就是按照二進制數據的方式存儲的&#xff0c;不會做任何的編碼轉換&#xff0c;這里相對于mysql就比較好&#xff08;個人感覺&#xff0…

[激光原理與應用-156]:光學器件 - 激光器為什么會出現多余的能量,哪些地方會出現多余能量?

在激光器運行過程中&#xff0c;多余能量的出現是不可避免的物理現象&#xff0c;其根源在于能量轉換與傳輸過程中的非理想特性。以下從能量來源、產生位置及具體機制三方面進行詳細說明&#xff1a;一、多余能量的主要來源泵浦源效率限制泵浦源&#xff08;如激光二極管、閃光…

Arxiv-Daily

Daily Paper Report - 2025-07-24 12:53 Today’s Recommended Papers 1. Multi-modal Multi-task Pre-training for Improved Point Cloud Understanding Authors: Liwen Liu, Weidong Yang, Lipeng Ma, Ben Fei Deep-Dive Summary: 多模態多任務預訓練以改善點云理解 預…

如何對云環境或者超融合系統進行性能測試?

最近幾個月&#xff0c;公司開啟了新的產品計劃&#xff0c;準備來做一個國產超融合一體機&#xff08;其實個人覺得現在入行已經晚了太多了&#xff0c;市場基本沒有多少了&#xff09; POC功能測試過完&#xff0c;但是感覺不到什么優勢&#xff0c;由于芯片架構采用的是arm架…

【web自動化測試】實戰

web自動化測試就是對界面的測試1、編寫測試用例2、參考測試用例&#xff0c;創建自動化測試項目&#xff0c;編寫自動化測試腳本論壇登錄頁&#xff1a;ForumLoginTest.py論壇首頁&#xff1a;ForumListTest.py論壇詳情頁&#xff1a;ForumDetailTest.py論壇編輯頁&#xff1a;…

在Maxscript中隨機化對象變換、顏色和材質

只需幾行Maxscript,即可為3ds Max場景帶來更多活力和變化! 在本文中,您將學習如何快速隨機化選定對象的位置、旋轉、線顏色和材質。 非常適合在ArchViz、動態圖形和產品可視化項目中創建更自然、更少機械的布局。 為什么要使用隨機化腳本? 1.快速為場景添加自然隨機性 2.…

分類數據集 - 交通事故場景分類數據集下載

數據集介紹&#xff1a;交通事故場景分類數據集&#xff0c;真實交通場景高質量圖片數據&#xff1b;適用實際項目應用&#xff1a;公共場所監控場景下是否發生交通事故檢測項目&#xff0c;以及作為監控場景通用交通檢測數據集場景數據的補充&#xff1b;數據集類別&#xff1…

內網公網詳解,及無公網IP內網穿透給外網直接遠程連接訪問的具體實現方法步驟

一、什么是內網、外網1、內網IP&#xff08;局域網IP&#xff09;是指在私有網絡或局域網內部使用的IP地址&#xff0c;無法直接從互聯網訪問&#xff0c;需通過NAT&#xff08;網絡地址轉換&#xff09;技術實現對外通信。內網IP&#xff08;Intranet IP&#xff09;是專為局域…

Redis協議數據遷移方式

主從復制&#xff08;REPLICAOF/SLAVEOF&#xff09;&#xff1a;目標實例掛為從節點&#xff0c;通過復制協議全量增量同步后切換為主。模擬從節點工具&#xff1a;模擬復制協議同步數據&#xff0c;常見兩種實現&#xff1a;(1) 拉取全量和增量命令流&#xff0c;在本地生成 …