C++中類和動態內存分配

new關鍵字

在C++中,內存分為棧和堆。棧中的對象生命周期較短,往往在作用域結束后就會銷毀,而堆中的對象生命周期較長,只有當使用delete或者程序結束時才會銷毀。而new則是將我們創建的對象分配到堆中,使對象可以跨作用域使用。

類成員

部分引用類型的類成員就會用到new,例如String中的char*指針,這樣類就可以處理不同長度的字符串,而不是在類設計時固定一個數組的長度,但是在類構造中使用new一定要記得釋放和同步,如果構造函數中使用new則在析構函數用要使用delete。

String::String(){ stp = new char[length + 1];}

String::~String(){ delete stp; stp = NULL;}

?

類的賦值運算符和復制構造函數

這個還挺重要的,因為在C++中不使用new也可以創建類對象,但是是分配在棧中的,這樣在使用指針的時候就會出現一些問題。

String function(String?stp){

String myString;? //隱式調用默認構造函數在棧中創建一個myString對象?

stp = myString;

return stp;

}? ? //當該作用域結束時,該對象會被銷毀,而其也會相應的調用其析構函數

在上述例子中,我們是可以獲得一個返回的String對象的,但是當調用其中的指針讀取字符時則會出現問題,首先:

1.當需要賦值時會創建一個臨時變量,然后調用復制構造函數將myString對象中的成員對象復制到臨時變量中。

2.在使用復制構造函數時,只會簡單的進行淺拷貝,對于基本類型是值拷貝,而引用類型則是地址的拷貝。

3.賦值運算符還是會進行一次對象的賦值,所以還需要重寫賦值運算符,因為不清楚程序是否會調用還是保險為好。

當使用stp = myString;時

可能會用到復制構造函數,也可能用到賦值運算符,在這種情況下可以使用兩者都進行重寫。

重寫復制構造函數:

Class_name(const Class_name&);

重寫賦值運算符:

Class_name& Class_name::operator=(cosnt Class_name&);

例子:

String(const String& str){

? ? ? ? delete[] this->stp;

? ? ? ? this->stp = new char[length + 1];

????????for(int i = 0; i < size;i++){

? ? ? ? ? ? ? ? ? ? ? ? this->stp[i] = str.stp[i];

????????}

}

使用上述構造函數和賦值運算的重寫,將類對象中的引用類型進行值的拷貝,這樣當賦值時臨時對象的銷毀就不會引起空指針或者內存泄漏的問題。

成員初始化列表

?C++構造函數提供了一種可以用來初始化數據成員的特殊語法,就是使用成員初始化列表。

語法:

String::String(int qs):qSize(qs),items(0),front(NULL),real(NULL){

????????????????????????

}

這種方式可以初始化非靜態的const對象。

或者直接在類中定義初始化

class String{

? ? ? ? private:

? ? ? ? enum{Q_SIZE = 10};

? ? ? ? Node* front = NULL;

? ? ? ? int items?= 0;

? ? ? ? const int qSize = Q_SIZE;

}

?

自動應用類型轉換

?將一個標準類型變量賦給另一種標準類型變量時,如果兩者類型兼容,則C++自動將這個值轉換為接收變量的類型。

只接受一個參的構造函數才能作為轉換函數。

String(double db);

String(int i);

String(char a);

當聲明以上構造函數時,使用下面方式會進行隱式的調用對應的構造函數,將其他類型轉為String類型對象.

String a = 1;? //調用形參為int的構造函數

String b = 23.2;? //double?

function(String str);

function(1);? //也會轉換為String對象

但是這樣會產生一部分問題,當并不想隱式的執行轉換函數時,需要使用explicit關鍵字來關閉這種自動特性。

explicit String(int i);? //不能隱式的作為轉換。?

String a = 1? //錯誤,不能使用隱式轉換

String a = (String)1;? //正確

String a = String(1);??//正確

類構造器也支持自動轉換,允許可以轉型的對象進行自動的轉換.

例如,只持有一個double型參的構造函數:

?String(double db);

String a = 1;? //將int類型轉換為double類型然后創建對象。

但是自動轉換不能有二義性,如果String構造函數中還存在其他可以由int轉型的類型如long,則會出現錯誤,編譯器將提示錯誤。

轉換函數

?既然可以將其他類型轉換為類對象,也可以將類對象轉換為特定的一種類型,需要使用到轉換函數。

需要注意的是:

1.轉換函數為類方法

2.不允許有返回類型

3.不能有型參

語法:

operator double();

例子:

explicit operator int(){? //使用explicit關鍵字,防止隱式轉化

? ? ? ?int length = this->size;? ?

? ? ? ? int sumNum = 0;

? ? ? ? int dig = 1;

? ? ? ? for(int i = 0; i < length; i++){

? ? ? ? ? ? ? ? sumNum += (this->stp[i] - '0') * dig;

? ? ? ? ? ? ? ? dig *= 10;? ? ? ? ? ?

????????} ? ??

? ? ? ? return sumNum;

}

在上述例子中,將字符數組中的數字進行計算,得出了一個int值,實現了將String對象轉換為int類型。?

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

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

相關文章

2023年【廣東省安全員B證第四批(項目負責人)】報名考試及廣東省安全員B證第四批(項目負責人)復審考試

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 廣東省安全員B證第四批&#xff08;項目負責人&#xff09;報名考試是安全生產模擬考試一點通總題庫中生成的一套廣東省安全員B證第四批&#xff08;項目負責人&#xff09;復審考試&#xff0c;安全生產模擬考試一點…

json_to_mask

修改后的json_to_dataset文件&#xff0c;直接復制替換你自己原始的json_to_dataset&#xff0c;建議保存一下原版import argparse import base64 import json import os import os.path as ospimport imgviz import PIL.Imagefrom labelme.logger import logger from labelme …

java:springboot單元測試spring-boot-starter-test

背景 Java的單元測試可以使用多個框架&#xff0c;其中比較流行的包括&#xff1a; JUnit&#xff1a;JUnit是Java單元測試最常用的框架&#xff0c;它提供了一套豐富的API&#xff0c;可以方便地編寫測試用例和測試套件。JUnit 5是JUnit的最新版本&#xff0c;引入了許多新功…

ElMessageBox中的子組件回調關閉函數

父組件中&#xff1a; const closeMessageBox () > {ElMessageBox.close();getList(); };const open () > {ElMessageBox({title: 添加商品,message: h(AddTaxExemption, { onClose: closeMessageBox }),customClass: custom-message-box, showConfirmButton: false,d…

各大電商平臺雙十一“狂飆”,如何選擇商城系統?

今年是“雙十一”的第十五年。作為各大平臺和品牌的全年最重要的營銷節點&#xff0c;品牌們可謂是來勢洶洶&#xff0c;各種促銷活動和優惠力度讓人眼花繚亂。 淘天數據顯示&#xff0c;天貓促銷活動開售當晚&#xff0c;155個品牌開賣成交額突破1億元&#xff1b;首小時內7.1…

str轉wstr的三種方法和從網站獲取json數據到數據隨機提取,返回拼接字符串和動態數組

庫的設置 hv庫 外部包含目錄&#xff1a;…\include\libhv_new\hv; 庫目錄&#xff1a;…\include\libhv_new\lib\x86\Release; 附加依賴項&#xff1a;hv.lib; //Get請求 獲取json數據&#xff0c;然后提取符合 條件的&#xff0c;time值大于自定義變量的值&#xff0c;然后取…

【UE】用樣條線實現測距功能(上)

目錄 效果 步驟 一、創建樣條網格體組件3D模型 二、實現點擊連線功能 三、實現顯示兩點間距離功能 效果 步驟 一、創建樣條網格體組件3D模型 創建一個圓柱模型&#xff0c;這里底面半徑設置為10mm&#xff0c;高度設置為1000mm 注意該模型的坐標軸在如下位置&#xff1…

基于pytest的服務端http請求的自動化測試框架?

1、引言 我有一個朋友是做 Python 自動化測試的。前幾天他告訴我去參加一個大廠面試被刷了。 我問他是有沒有總結被刷下來的原因。他說面試官問了一些 pytest 單元測試框架相關的知識&#xff0c;包括什么插件系統和用力篩選。但是他所在的公司用的技術是基于 unittest 的&am…

Sentinel與SpringBoot整合

好的&#xff0c;以下是一個簡單的Spring Cloud整合Sentinel的代碼示例&#xff1a; 首先&#xff0c;在pom.xml中添加以下依賴&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…

swift-基礎

print區別 print(1,2,3, separator: "-", terminator: "\n")//表示用-來分割//1-2-3 //terminator表示用\n作為終止符 var a "a",b "b" print(a b) //ab print("\(a)前面是a變量\(b)后面是b變量")變量 var name "…

Win10系統無法登錄Xbox live的四種解決方法

在Win10系統中&#xff0c;用戶可以登錄Xbox live平臺&#xff0c;暢玩自己喜歡的游戲。但是&#xff0c;有用戶卻遇到了無法登錄Xbox live的問題。接下來小編給大家詳細介紹四種簡單的解決方法&#xff0c;解決后用戶在Win10電腦上就能成功登錄上Xbox live平臺。 Win10系統無法…

Linux編程 文件操作 creat open

文件描述符 文件描述符在形式上是一個非負整數。實際上&#xff0c;它是一個索引值&#xff0c;指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時&#xff0c;內核向進程返回一個文件描述符。 啟動一個進程之后&#xff0c;…

SquareCTF-2023 Web Writeups

官方wp&#xff1a;CTFtime.org / Square CTF 2023 tasks and writeups sandbox Description&#xff1a; I “made” “a” “python” “sandbox” “”“” nc 184.72.87.9 8008 先nc連上看看&#xff0c;只允許一個單詞&#xff0c;空格之后的直接無效了。 flag就在當…

(C)一些題2

1.在 C 語言中&#xff08;以 16位 PC 機為例&#xff09;,5種基本數據類型的存儲空間長度的順序為&#xff08;&#xff09; A . char < int < long int <float < double B . char int < long int<float <double C . char < int < long int …

inux應用開發基礎知識——串口應用編程(十一)

前言&#xff1a; 在Linux系統中&#xff0c;串口設備以文件的形式存在&#xff0c;通常位于/dev目錄下&#xff0c;如ttyS0、ttyUSB0等。這些設備文件可以用于讀取和寫入數據。要使用串口設備&#xff0c;需要打開相應的設備文件。在打開串口時&#xff0c;可以使用O_RDWR選項…

哈夫曼樹你需要了解一下

哈夫曼樹介紹哈夫曼數特點哈夫曼應用場景哈夫曼構建過程哈夫曼樹示例拓展 哈夫曼樹介紹 哈夫曼樹&#xff08;Huffman Tree&#xff09;是一種特殊的二叉樹&#xff0c;也被稱為最優二叉樹。在計算機科學中&#xff0c;它是由權值作為葉子節點構造出來的一種二叉樹。哈夫曼樹的…

05 取樣器(BeanShell和JSR223 Sampler)

一、取樣器作用 1、取樣器可以理解為Jmeter的橋梁&#xff0c;或者是Jmeter的加工廠&#xff1b; 2、Jmeter使用過程中&#xff0c;經常有些數據不能直接使用&#xff0c;需要加工后才能使用&#xff1b;這樣就用到了取樣器&#xff1b;但是這里存在問題&#xff0c;Jmeter中的…

Differences between package.json and pnpm-lock.yaml

1.pnpm-lock.yaml 是pnpm包管理工具生成的確保依賴包的版本在所有的環境里面都相同對依賴包的任何操作都會更新在該文件中&#xff0c;因此&#xff0c;需要確保提交到代碼倉庫中。包含了解析的依賴項和版本號。如下圖&#xff1a; 2.package.json 列出應用所需的依賴和元數…

批量修改文件名

原理&#xff1a; 利用 bat 的 REN 舊名字 新名字 命令 第一步&#xff1a; 【CtrlA】選中所有文件&#xff0c;按下【Shift】鍵右鍵任一文件夾彈出窗口選擇【復制為路徑】 第二步&#xff1a; 使用Excel技巧構造出 REN 舊名字 新名字 第三步&#xff1a; 用拼接好的命令…

【黑馬甄選離線數倉day01_項目介紹與環境準備】

1. 行業背景 1.1 電商發展歷史 電商1.0: 初創階段20世紀90年代&#xff0c;電商行業剛剛興起&#xff0c;主要以B2C模式為主&#xff0c;如亞馬遜、eBay等 ? 電商2.0: 發展階段21世紀初&#xff0c;電商行業進入了快速發展階段&#xff0c;出現了淘寶、京東等大型電商平臺&a…