C++如何使用new來初始化指向類的指針
C++使用new來初始化類的指針
1.ClassName * p = new ClassName;
調(diào)用默認構造函數(shù)。
如果類里沒有寫默認構造函數(shù),會使用編譯器幫我們生成的,但不會初始化成員變量,如
class NoConstructor ? ?//沒寫構造函數(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)用默認構造函數(shù)。
如果類里沒有寫默認構造函數(shù),會使用編譯器幫我們生成的,并且會初始化成員變量,比如 int 類會被初始化為 0
NoConstructor* p2 = new NoConstructor(); p2->printVal();`
此時打印出來值是 0
3.ClassName * p = new ClassName(arg);
調(diào)用自定義構造函數(shù),或含參數(shù)的默認構造函數(shù)(如果這兩種函數(shù)都定義了,它們的arg類型必須不同,這是函數(shù)重載的要求)。
4.補充
關于幾個概念:默認構造函數(shù)是指無參的構造函數(shù),或有參數(shù)(即形參)、并且為所有形參指定了實參的構造函數(shù)。
非默認構造函數(shù)稱為自定義構造函數(shù)。
如果在一個類里,兩種默認構造函數(shù)都寫了,那么new ClassName和new ClassName()都不可用。因為編譯器無法確定要使用哪一個構造函數(shù)。
C++指針初始化問題
c++中的指針是一個很經(jīng)典的用法,但是也是最容易出錯的,比如定義了一個指針,必須對其進行初始化,不然這個指針指向的是一個未知的內(nèi)存地址,后續(xù)對其操作的時候,會報錯。
這只是其次,最讓人頭疼的就是指針錯誤問題,往往編譯的時候可以通過,在程序運行的時候,就會出現(xiàn)異常,如果對程序不是很熟悉,則不是很容易找到問題所在,我最近就遇到過很多這樣的問題,定義了一個結構體指針,使用的時候忘記初始化,導致在后邊使用的時候程序報異常。
下面就總結一下c++指針初始化的一些方法,以及我自己遇到的一些問題以及心得體會。
c++指針初始化的一般方法
1.將一個已經(jīng)在內(nèi)存中存在變量的地址傳遞給定義的指針
這個指針就指向這個變量的內(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釋放,因為new出來的是返回的堆的空間,堆的空間是不會自動釋放的,存放變量的棧才會自動釋放。
delete釋放其實只是釋放了申請的這塊內(nèi)存空間,但是指針并沒有沒撤銷,指針還是指向這塊地址,但是不可用(靠人品吃飯的有可能可以用),是非法的。所以用delete釋放掉一塊堆內(nèi)存時,應該自己手動將指針設置為NULL。
3.把指針設置為NULL或者0
這樣做一般只是為了沒有具體初始化的時候做的,這樣避免了野指針,后面可以使用if(指針==NULL)來判斷,然后再進行操作。
自己遇見的問題
我在使用結構體指針的時候,忘記將結構體指針初始化,導致后面訪問結構體成員變量的時候出現(xiàn)錯誤(那種編譯沒錯,執(zhí)行出錯的問題),后來將指針使用new初始化解決,還有一點就是,全局的變量名稱與局部變量名稱不要一樣。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C++實現(xiàn)LeetCode(122.買股票的最佳時間之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(122.買股票的最佳時間之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07