C++ 創建并初始化對象

創建并初始化C++對象

當我們創建一個C++對象時,它需要占用一些內存,即使我們寫一個完全為空的類,類中沒有成員,什么也沒有,它至少也要占用一個字節的內存。但是我們類中有很多成員,它們需要存儲在某地方,當我們決定開始使用這個對象時,我們會創建一堆變量,對象有一堆變量,我們需要在電腦的某個地方分配內存,這樣我們就可以記住這些變量設置的值。

應用程序會將內存主要分為兩部分,棧和堆,還有其他部分的內存,比如源代碼的區域。

在C++中我們要選擇對象要放在哪里,對象是在棧上還是在堆上創建,它們有不同的功能差異。

棧:棧對象有一個自動的生存期,他們的生存期實際上是由它聲明的地方的作用域決定的,只要變量超出作用域,也就是說內存被釋放了,因為當作用域結束的時候,棧會彈出作用域里面的東西,棧上的任何東西會被釋放。

堆:一旦在堆中分配一個對象,實際上你已經在堆上創建了一個對象,它會一直待在那里,直到你做出決定,確定不需要它,想要釋放這個對象,那怎末處理這段內存都行。
?

代碼案例:

在棧上創建:?

在什么時候在棧上創建對象?

幾乎所有的時候,如果你能像這樣在棧上創建對象,那就像這樣創建對象,因為這是C++中最快的方法,也是可以管控的方法,去初始化對象

某些情況下不能這么做的原因?

1、如果將實例化對象放到main函數的生存期外

void Function(){int a = 2;Entity entity;}

一旦到達函數結尾的花括號,這個entity會從內存中被銷毀
當我們在main函數中調用Function時,就為這個函數創建了一個棧結構,它包含了我們聲明的所有局部變量,其中包括基本類型,也包括我們的類和對象,當函數結束時,棧幀會被銷毀,即棧上所有的內存,所有創建的變量都消失了

如果想讓括號{}內的實例化對象在作用域之外依然存在,就不能分配到棧上,需要使用堆分配。

2、如果entity的規模太大,可能有太多的entity,可能沒有足夠的空間在棧上分配,因為棧通常非常小,通常是1M/2M

# include <iostream>
# include <string>
using namespace std;class Entity
{
private:string m_Name;  //只有一個成員,是一個字符串
public:Entity() : m_Name("Unknown") {}Entity(const string& name) : m_Name(name) {}const string& GetName() const { return m_Name; }
};int main()
{// 1、在棧上創建Entity entity; // 實際上調用了默認構造函數Entity() : m_Name("Unknown")cout << entity.GetName() << endl;Entity entity1("chen");// 等價于 Entity entity1 = Entity("chen")cout << entity1.GetName() << endl;/*在什么時候在棧上創建對象?幾乎所有的時候如果你能像這樣在棧上創建對象,那就像這樣創建對象,因為這是C++中最快的方法,也是可以管控的方法,去初始化對象某些情況下不能這么做的原因?1、如果將實例化對象放到main函數的生存期外void Function(){int a = 2;Entity entity;}一旦到達這個花括號,這個entity會從內存中被銷毀當我們調用Function時,就為這個函數創建了一個棧結構,它包含了我們聲明的所有局部變量,其中包括基本類型,也包括我們的類和對象,當函數結束時,棧幀會被銷毀,即棧上所有的內存,所有創建的變量都消失了Entity* e;{Entity entity2("cherno");e = &entity2;cout << entity2.GetName() << endl;} 一旦出了{}作用域,就到達了棧端,entity2對象就已經不存在了如果想讓括號{}內的實例化對象在作用域之外依然存在,就不能分配到棧上,需要使用堆分配cin.get();return 0;
}

在堆上創建:

在堆上創建,首先要做的就是在改變類型,將Entity改成Entity*,通過new關鍵字,這里最大的區別不是那個類型變成了指針,而是new關鍵字,new關鍵字是關鍵。

Entity* entity = new Entity("cherno");當我們調用new Entity時,會在棧上分配內存,調用構造函數,這個new Entity實際上會返回一個Entity*,它會返回entity在堆上被分配的內存地址。

使用new關鍵字必須調用delete釋放內存

delete + 變量名:delete entity;

性能問題:在堆上分配要比棧花費更長的時間,而且在堆上分配的話,您必須手動釋放被分配的內存

# include <iostream>
# include <string>
using namespace std;class Entity
{
private:string m_Name;  //只有一個成員,是一個字符串
public:Entity() : m_Name("Unknown") {}Entity(const string& name) : m_Name(name) {}const string& GetName() const { return m_Name; }
};int main()
{// 2、在堆上創建/*在堆上創建,首先要做的就是在改變類型,將Entity改成Entity*,通過new關鍵字,這里最大的區別不是那個類型變成了指針,而是new關鍵字,new關鍵字是關鍵當我們調用new Entity時,會在棧上分配內存,調用構造函數,這個new Entity實際上會返回一個Entity*,它會返回entity在堆上被分配的內存地址*/Entity* entity = new Entity("cherno");//釋放內存//delete 變量名;delete entity;/*性能問題:在堆上分配要比棧花費更長的時間,而且在堆上分配的話,您必須手動釋放被分配的內存*/cin.get();return 0;
}

創建對象的兩種方法,如何選擇?

如果對象太大,或者需要顯示地控制對象的生存期,那就是用堆創建,其他情況就是用棧創建。

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

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

相關文章

【擴散模型】生成模型中的Residual Self-Attention UNet 以及 DDPM的pytorch代碼

參考&#xff1a; [1] https://github.com/xiaohu2015/nngen/blob/main/models/diffusion_models/ddpm_cifar10.ipynb [2] https://www.bilibili.com/video/BV1we4y1H7gG/?spm_id_from333.337.search-card.all.click&vd_source9e9b4b6471a6e98c3e756ce7f41eb134 TOC 1 UNe…

視黃酸誘導基因-1敲除誘導樹突狀細胞的不成熟特性并延長異體移植小鼠的存活時間研究【AbMole】

器官移植是一種用于替換因疾病、損傷或其他原因受損的人體器官的醫療程序。盡管器官移植可以挽救生命并顯著提高生活質量&#xff0c;但存在供體器官短缺、排斥反應、器官功能障礙、感染和藥物副作用等問題。為了提高移植成功率和受體健康&#xff0c;需要有效的免疫策略。樹突…

如何使用支付寶沙箱環境本地配置模擬支付并實現公網遠程訪問【內網穿透】

文章目錄 前言1. 下載當面付demo2. 修改配置文件3. 打包成web服務4. 局域網測試5. 內網穿透6. 測試公網訪問7. 配置二級子域名8. 測試使用固定二級子域名訪問 前言 在沙箱環境調試支付SDK的時候&#xff0c;往往沙箱環境部署在本地&#xff0c;局限性大&#xff0c;在沙箱環境…

原理篇-- 定時任務xxl-job-服務端(admin)項目啟動過程--JobFailMonitorHelper初始化 (5)

文章目錄 前言一、JobFailMonitorHelper作用&#xff1a;二、JobFailMonitorHelper源碼內容&#xff1a;2.1 start() 初始化2.1.1 任務失敗重試:2.1.2 任務失敗告警信息發送:2.1.2.1 JobAlarmer 告警類&#xff1a;2.1.2.2 alarm 告警信息發送&#xff1a; 2.2 toStop() 終止線…

數據可視化原理-騰訊-3D網格熱力圖

在做數據分析類的產品功能設計時&#xff0c;經常用到可視化方式&#xff0c;挖掘數據價值&#xff0c;表達數據的內在規律與特征展示給客戶。 可是作為一個產品經理&#xff0c;&#xff08;1&#xff09;如果不能夠掌握各類可視化圖形的含義&#xff0c;就不知道哪類數據該用…

壁爐火焰溫和而寧靜,警惕火焰兇猛的潛在危害

在寒冷的冬夜&#xff0c;壁爐散發的溫暖和閃爍的火焰成為家庭的心靈港灣。然而&#xff0c;我們在享受壁爐帶來的溫馨時&#xff0c;有時候也要關注火焰的兇猛度&#xff0c;因為它可能引發一系列潛在危害。 首先&#xff0c;壁爐的火焰過于兇猛可能導致空氣質量下降。當火焰過…

從零開始手寫RPC框架(4)

這一節主要講述網絡傳輸模塊的代碼&#xff0c;并且幾乎每一行代碼都加上了我個人理解的注釋&#xff0c;同時也講述了其中一些以前沒見過的函數&#xff0c;和大致的底層運行邏輯。 目錄 網絡傳輸實體類網絡傳輸實現基于Socket實現網絡傳輸基于Netty實現網絡傳輸客戶端服務端 …

【JavaEE進階】 Linux常用命令

文章目錄 &#x1f343;前言&#x1f334;ls 與 pwd&#x1f6a9;ls&#x1f6a9;pwd &#x1f38d;cd&#x1f6a9;認識Linux目錄結構 &#x1f340;touch與cat&#x1f6a9;touch&#x1f6a9;cat &#x1f332;mkdir與rm&#x1f6a9;mkdir&#x1f6a9;rm &#x1f384;cp與…

GD庫沒有安裝FreeType 支持Call to undefined function App\Services\imagettfbbox()

GD庫是一個功能強大的圖像處理庫&#xff0c;廣泛用于生成和處理圖像。然而&#xff0c;默認情況下&#xff0c;GD庫不包含FreeType擴展&#xff0c;該擴展用于處理字體和文本。如果您需要在GD庫中使用更多的字體和文本效果&#xff0c;您可以按照以下步驟安裝和啟用FreeType擴…

十五、單詞造句

描述 GG Bond在和妹妹做一個游戲&#xff0c;GG Bond給定了妹妹一些單詞字符串&#xff0c;他想讓妹妹把這些單詞拼接成以空格間隔開的句子&#xff0c;很可惜妹妹Python沒有學好&#xff0c;你能使用join函數幫幫她嗎&#xff1f; 輸入描述&#xff1a; 多行輸入多個字符串…

Java基礎 - 7 - 常用API(二)

API&#xff08;全稱 Application Programming Interface&#xff1a;應用程序編程接口&#xff09; API就是Java幫我們已經寫好的一些程序&#xff0c;如類、方法等&#xff0c;可以直接拿過來用 JDK8 API文檔&#xff1a;Java Platform SE 8 一. Object Object類的作用 Ob…

mybatis多數據源切換

1.前提 項目中有可能需要去其他的數據庫取其他的表的信息 2.思路 2.1 直接使用原生jdbc&#xff08;不推薦&#xff09; 2.2 不使用我們全局配置的mybatis&#xff0c;對指定文件夾下使用我們指定的Session 3.解決辦法 指定該配置的范圍 package com.maycur.openapi.dao.my…

『Linux從入門到精通』第 ? 期 - 管道

文章目錄 &#x1f490;專欄導讀&#x1f490;文章導讀&#x1f427;進程間通信的目的&#x1f427;如何進行進程間通信&#x1f427;進程間通信的分類&#x1f427;管道&#x1f426;什么是管道&#x1f426;管道原理 &#x1f427;實例代碼&#x1f427;管道的特點&#x1f4…

Protobuf學習筆記以及序列化的一些概念要點(暫放C++筆記專欄)

Protobuf學習筆記以及序列化的一些概念要點 —— 杭州 2024-03-03 文章目錄 Protobuf學習筆記以及序列化的一些概念要點1.Protobuf概念2.實際測試2.1.準備一個test.proto2.2.使用 protoc 命令行工具來編譯一個 Protocol Buffers 文件 test.proto3.3.創建一個main.cpp寫C++代碼…

mysql 事務的隔離級別

一、事務的隔離級別要解決的問題&#xff1a; 1&#xff09;臟讀&#xff1a;讀到了其它事務未提交的數據即臟讀&#xff0c;未提交意味著數據有可能會被回滾&#xff0c;也就是最終有可能不會存儲到數據庫中&#xff0c;即讀到了最終不一定存在存在的數據&#xff0c;即為臟讀…

如何選擇程序員職業賽道:挑戰與機遇并存的職業探索指南

程序員如何選擇職業賽道&#xff1f; 作為程序員&#xff0c;選擇職業賽道是一項重要的決策&#xff0c;不僅影響你的職業發展&#xff0c;也影響著你的工作生活。本文將為你介紹如何選擇程序員職業賽道&#xff0c;以及每個方向的特點、挑戰和機遇&#xff0c;幫助你做出明智…

《極客時間 - 左耳聽風》【文章筆記 + 個人思考】

《極客時間 - 左耳聽風》 原文鏈接 &#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 備注&#xff1a;加粗部分為個人思考 01 | 程序員如何用技術變現&#xff1f;&#xff08;上&#xff09; 備注&#xff1a;加粗部分為個人思考) 01 | 程序員如何…

Window系統部署Splunk Enterprise并結合內網穿透實現遠程訪問本地服務

文章目錄 前言1. 搭建Splunk Enterprise2. windows 安裝 cpolar3. 創建Splunk Enterprise公網訪問地址4. 遠程訪問Splunk Enterprise服務5. 固定遠程地址 前言 本文主要介紹如何簡單幾步&#xff0c;結合cpolar內網穿透工具實現隨時隨地在任意瀏覽器&#xff0c;遠程訪問在本地…

【24最新版PythonPycharm安裝教程】小白保姆級別安裝教程

今天&#xff0c;我就來教大家一下&#xff0c;如何去安裝Python&#xff01; 需要博主打包好的一鍵激活版Pycharm&&Python也可掃下方直接獲取 ? 1 了解Python Python是一種面向對象的解釋型計算機程序設計語言&#xff0c;由荷蘭人Guido van Rossum于1989年發明&…

[C++]使用純opencv去部署yolov9的onnx模型

【介紹】 部署 YOLOv9 ONNX 模型在 OpenCV 的 C 環境中涉及一系列步驟。以下是一個簡化的部署方案概述&#xff0c;以及相關的文案。 部署方案概述&#xff1a; 模型準備&#xff1a;首先&#xff0c;你需要確保你有 YOLOv9 的 ONNX 模型文件。這個文件包含了模型的結構和權…