C++如何使用new來初始化指向類的指針
C++使用new來初始化類的指針
1.ClassName * p = new ClassName;
調(diào)用默認(rèn)構(gòu)造函數(shù)。
如果類里沒有寫默認(rèn)構(gòu)造函數(shù),會使用編譯器幫我們生成的,但不會初始化成員變量,如
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ù),會使用編譯器幫我們生成的,并且會初始化成員變量,比如 int 類會被初始化為 0
NoConstructor* p2 = new NoConstructor(); p2->printVal();`
此時打印出來值是 0
3.ClassName * p = new ClassName(arg);
調(diào)用自定義構(gòu)造函數(shù),或含參數(shù)的默認(rèn)構(gòu)造函數(shù)(如果這兩種函數(shù)都定義了,它們的arg類型必須不同,這是函數(shù)重載的要求)。
4.補充
關(guān)于幾個概念:默認(rèn)構(gòu)造函數(shù)是指無參的構(gòu)造函數(shù),或有參數(shù)(即形參)、并且為所有形參指定了實參的構(gòu)造函數(shù)。
非默認(rèn)構(gòu)造函數(shù)稱為自定義構(gòu)造函數(shù)。
如果在一個類里,兩種默認(rèn)構(gòu)造函數(shù)都寫了,那么new ClassName和new ClassName()都不可用。因為編譯器無法確定要使用哪一個構(gòu)造函數(shù)。
C++指針初始化問題
c++中的指針是一個很經(jīng)典的用法,但是也是最容易出錯的,比如定義了一個指針,必須對其進(jìn)行初始化,不然這個指針指向的是一個未知的內(nèi)存地址,后續(xù)對其操作的時候,會報錯。
這只是其次,最讓人頭疼的就是指針錯誤問題,往往編譯的時候可以通過,在程序運行的時候,就會出現(xiàn)異常,如果對程序不是很熟悉,則不是很容易找到問題所在,我最近就遇到過很多這樣的問題,定義了一個結(jié)構(gòu)體指針,使用的時候忘記初始化,導(dǎo)致在后邊使用的時候程序報異常。
下面就總結(jié)一下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)存時,應(yīng)該自己手動將指針設(shè)置為NULL。
3.把指針設(shè)置為NULL或者0
這樣做一般只是為了沒有具體初始化的時候做的,這樣避免了野指針,后面可以使用if(指針==NULL)來判斷,然后再進(jìn)行操作。
自己遇見的問題
我在使用結(jié)構(gòu)體指針的時候,忘記將結(jié)構(gòu)體指針初始化,導(dǎo)致后面訪問結(jié)構(gòu)體成員變量的時候出現(xiàn)錯誤(那種編譯沒錯,執(zhí)行出錯的問題),后來將指針使用new初始化解決,還有一點就是,全局的變量名稱與局部變量名稱不要一樣。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++ vector如何動態(tài)申請內(nèi)存的元素
vector是一種動態(tài)數(shù)組,本文主要介紹了C++ vector如何動態(tài)申請內(nèi)存的元素,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07
C語言數(shù)據(jù)結(jié)構(gòu)之隊列的定義與實現(xiàn)
隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(head)進(jìn)行刪除操作,而在表的后端(tail)進(jìn)行插入操作。本文將詳細(xì)講講C語言中隊列的定義與實現(xiàn),感興趣的可以了解一下2022-07-07
Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程
這篇文章主要介紹了Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程 ,需要的朋友可以參考下2020-02-02

