C++如何使用new來初始化指向類的指針
C++使用new來初始化類的指針
1.ClassName * p = new ClassName;
調(diào)用默認(rèn)構(gòu)造函數(shù)。
如果類里沒有寫默認(rèn)構(gòu)造函數(shù),會(huì)使用編譯器幫我們生成的,但不會(huì)初始化成員變量,如
class NoConstructor ? ?//沒寫構(gòu)造函數(shù)的類 { public: ?? ?~NoConstructor() {} ?? ?void printVal()? ?? ?{? ?? ??? ?cout << m_val << endl;? ?? ?} private: ?? ?int m_val; }; NoConstructor* p1 = new NoConstructor; p1->printVal();`
打印出來的值是 -842150451,也就是未初始化。
2.ClassName * p = new ClassName();
調(diào)用默認(rèn)構(gòu)造函數(shù)。
如果類里沒有寫默認(rèn)構(gòu)造函數(shù),會(huì)使用編譯器幫我們生成的,并且會(huì)初始化成員變量,比如 int 類會(huì)被初始化為 0
NoConstructor* p2 = new NoConstructor(); p2->printVal();`
此時(shí)打印出來值是 0
3.ClassName * p = new ClassName(arg);
調(diào)用自定義構(gòu)造函數(shù),或含參數(shù)的默認(rèn)構(gòu)造函數(shù)(如果這兩種函數(shù)都定義了,它們的arg類型必須不同,這是函數(shù)重載的要求)。
4.補(bǔ)充
關(guān)于幾個(gè)概念:默認(rèn)構(gòu)造函數(shù)是指無參的構(gòu)造函數(shù),或有參數(shù)(即形參)、并且為所有形參指定了實(shí)參的構(gòu)造函數(shù)。
非默認(rèn)構(gòu)造函數(shù)稱為自定義構(gòu)造函數(shù)。
如果在一個(gè)類里,兩種默認(rèn)構(gòu)造函數(shù)都寫了,那么new ClassName和new ClassName()都不可用。因?yàn)榫幾g器無法確定要使用哪一個(gè)構(gòu)造函數(shù)。
C++指針初始化問題
c++中的指針是一個(gè)很經(jīng)典的用法,但是也是最容易出錯(cuò)的,比如定義了一個(gè)指針,必須對(duì)其進(jìn)行初始化,不然這個(gè)指針指向的是一個(gè)未知的內(nèi)存地址,后續(xù)對(duì)其操作的時(shí)候,會(huì)報(bào)錯(cuò)。
這只是其次,最讓人頭疼的就是指針錯(cuò)誤問題,往往編譯的時(shí)候可以通過,在程序運(yùn)行的時(shí)候,就會(huì)出現(xiàn)異常,如果對(duì)程序不是很熟悉,則不是很容易找到問題所在,我最近就遇到過很多這樣的問題,定義了一個(gè)結(jié)構(gòu)體指針,使用的時(shí)候忘記初始化,導(dǎo)致在后邊使用的時(shí)候程序報(bào)異常。
下面就總結(jié)一下c++指針初始化的一些方法,以及我自己遇到的一些問題以及心得體會(huì)。
c++指針初始化的一般方法
1.將一個(gè)已經(jīng)在內(nèi)存中存在變量的地址傳遞給定義的指針
這個(gè)指針就指向這個(gè)變量的內(nèi)存地址(相同的數(shù)據(jù)類型),完成初始化。
比如:
int a=2; int *b=&a;
2.利用new開辟一塊地址空間
struct test{ ? ? ? ?int a; ? ? ? ?int b; }*t; void main() { ? ? int c=0; ? ? test *t=new test(); ? ? c=t->a; }
使用 new開辟的空間,記得使用delete釋放,因?yàn)閚ew出來的是返回的堆的空間,堆的空間是不會(huì)自動(dòng)釋放的,存放變量的棧才會(huì)自動(dòng)釋放。
delete釋放其實(shí)只是釋放了申請(qǐng)的這塊內(nèi)存空間,但是指針并沒有沒撤銷,指針還是指向這塊地址,但是不可用(靠人品吃飯的有可能可以用),是非法的。所以用delete釋放掉一塊堆內(nèi)存時(shí),應(yīng)該自己手動(dòng)將指針設(shè)置為NULL。
3.把指針設(shè)置為NULL或者0
這樣做一般只是為了沒有具體初始化的時(shí)候做的,這樣避免了野指針,后面可以使用if(指針==NULL)來判斷,然后再進(jìn)行操作。
自己遇見的問題
我在使用結(jié)構(gòu)體指針的時(shí)候,忘記將結(jié)構(gòu)體指針初始化,導(dǎo)致后面訪問結(jié)構(gòu)體成員變量的時(shí)候出現(xiàn)錯(cuò)誤(那種編譯沒錯(cuò),執(zhí)行出錯(cuò)的問題),后來將指針使用new初始化解決,還有一點(diǎn)就是,全局的變量名稱與局部變量名稱不要一樣。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++中對(duì)象的常引用、動(dòng)態(tài)建立和釋放相關(guān)知識(shí)講解
這篇文章主要介紹了C++中對(duì)象的常引用、動(dòng)態(tài)建立和釋放相關(guān)知識(shí)講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例
這篇文章主要為大家介紹了使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05C語(yǔ)言實(shí)現(xiàn)學(xué)生考勤系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生考勤系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++實(shí)現(xiàn)LeetCode(122.買股票的最佳時(shí)間之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(122.買股票的最佳時(shí)間之二),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言 實(shí)現(xiàn)輸入任意多個(gè)整數(shù)
這篇文章主要介紹了C語(yǔ)言 實(shí)現(xiàn)輸入任意多個(gè)整數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12