【C++】38.类成员变量声明为 对象与指针的区别
在我們平時(shí)寫(xiě)代碼或閱讀代碼時(shí),經(jīng)常會(huì)看到,某個(gè)類A中需要使用另一個(gè)類B的方法。那么下面會(huì)看到兩種用法:
- 一種是直接定義一個(gè)B類對(duì)象。
- 一種是在類A中定義一個(gè)B類指針;
如:
// 頭文件 std::shared_ptr<cv::Mat> img_ptr_; std::shared_ptr<BlockingQueue<std::shared_ptr<cv::Mat>>>img_queue_ptr_; // .cc文件 // std::make_shared在動(dòng)態(tài)內(nèi)存中分配一個(gè)對(duì)象并初始化它, 返回指向此對(duì)象的shared_ptr img_ptr_= std::make_shared<cv::Mat>; img_queue_ptr_ = std::make_shared<BlockingQueue<std::shared_ptr<cv::Mat>>>(1);//定義在 頭文件 .h 中,聲明一個(gè)基類接口指針,沒(méi)分配內(nèi)存 std::unique_ptr<Visualizer> visualizer_; //在 .cc文件中,將指針重置為類指針,并分配內(nèi)存 visualizer_.reset(new Visualizer());
還有下面這種基類子類指針用法:
//定義在 頭文件 .h 中,聲明一個(gè)基類接口指針,沒(méi)分配內(nèi)存 std::unique_ptr<BaseDetector> detector_; //在 .cc文件中,將指針重置為某個(gè)具體子類指針,并分配內(nèi)存 detector_.reset(new Pix2pixDetector());原文鏈接
類的指針:他是一個(gè)內(nèi)存地址值,他指向內(nèi)存中存放的類對(duì)象(包括一些成員變量所賦的值).
對(duì)象,他是利用類的構(gòu)造函數(shù)在內(nèi)存中分配一塊內(nèi)存(包括一些成員變量所賦的值).
在應(yīng)用時(shí):
1.引用成員: 對(duì)象用" . “操作符; 指針用” -> "操作符.
2.生命期: 若是成員變量,則是類的析構(gòu)函數(shù)來(lái)釋放空間;若是函數(shù)中的臨時(shí)變量,則作用域是該函數(shù)體內(nèi).而指針,則需利用delete 在相應(yīng)的地方釋放分配的內(nèi)存塊.
注意:用new ,一定要delete…
類的對(duì)象:用的是內(nèi)存棧,是個(gè)局部的臨時(shí)變量.
類的指針:用的是內(nèi)存堆,是個(gè)永久變量,除非你釋放它.
當(dāng)類是有虛函數(shù)的基類,Func是它的一個(gè)虛函數(shù),則調(diào)用Func時(shí):
類的對(duì)象:調(diào)用的是它自己的Func;
類的指針:調(diào)用的是分配給它空間時(shí)那種類的Func;
對(duì)于一個(gè)類的對(duì)象和這個(gè)類的指針(用new運(yùn)算符分配內(nèi)存)在應(yīng)用時(shí)有何區(qū)別
1.類和對(duì)象是兩回事,對(duì)象是類的實(shí)例;
2.對(duì)象是在棧中分配的,使用new生成的對(duì)象是在堆中分配的;
3.要發(fā)揮虛函數(shù)的強(qiáng)大作用,必須使用指針來(lái)訪問(wèn)對(duì)象.
指針可以實(shí)現(xiàn)多態(tài),直接用對(duì)象不行
執(zhí)行定義對(duì)象,在棧空間
new的在堆
類型決定了你能做什么.
其實(shí)作用基本一樣 都是為了調(diào)用類的成員變量 和成員函數(shù)用的
當(dāng)你希望明確使用這個(gè)類的時(shí)候,最好使用對(duì)象,如果你希望使用C++中的動(dòng)態(tài)綁定,則最好使用指針或者引用
指針和引用用起來(lái)更靈活,容易實(shí)現(xiàn)多態(tài)等
1.在類的聲明尚未完成的情況下,可以聲明指向該類的指針,但是不可聲明該類的對(duì)象…
2.父類的指針可以指向子類的對(duì)象…
定義對(duì)象實(shí)例時(shí),分配了內(nèi)存。指針變量則未分配類對(duì)象所需內(nèi)存,除非new了
指針變量是間接訪問(wèn),但可實(shí)現(xiàn)多態(tài)(通過(guò)父類指針可調(diào)用子類對(duì)象),并且沒(méi)有調(diào)用構(gòu)造函數(shù)。
直接聲明可直接訪問(wèn),但不能實(shí)現(xiàn)多態(tài),聲明即調(diào)用了構(gòu)造函數(shù)(已分配了內(nèi)存)。
至于那個(gè)效率高要看程序調(diào)用過(guò)程而定。
C++的精髓之一就是多態(tài)性,只有指針或者引用可以達(dá)到多態(tài)。對(duì)象不行
用指針:
第一實(shí)現(xiàn)多態(tài)。
第二,在函數(shù)調(diào)用,傳指針參數(shù)。不管你的對(duì)象或結(jié)構(gòu)參數(shù)多么龐大,你用指針,傳過(guò)去的就是4個(gè)字節(jié)。如果用對(duì)象,參數(shù)傳遞占用的資源就太大了
原文鏈接
C++編程過(guò)程中,在一個(gè)類的數(shù)據(jù)成員是一個(gè)類時(shí),定義這個(gè)成員變量為對(duì)象還是指針是有講究的。
在C++中,
ClassTest objTest;就已經(jīng)構(gòu)造了對(duì)象,分配了空間
而在C#、Java中,
ClassTest objTest;只是聲明,并沒(méi)有分配空間。
在C++中,ClassTest objTest;是在棧上分配空間,ClassTest *pobjTest = new ClassTest;是在堆上分配空間。
棧分配的空間自動(dòng)回收,堆分配的空間需要手動(dòng)回收。
那么對(duì)于C++類中數(shù)據(jù)成員為類類型時(shí),將它定義為對(duì)象還是指針,并沒(méi)有絕對(duì)的情況,具體情況可以具體對(duì)待。
本質(zhì)上是對(duì)象分配區(qū)域的問(wèn)題:前者是在棧(stack)上分配空間,后者是在堆(heap)上分配空間。
一般來(lái)說(shuō),可以定義為對(duì)象,在如下情況考慮把數(shù)據(jù)成員定義成指針:
- 1)有多態(tài)的情況;會(huì)用到虛函數(shù),基類指針;
- 2)可能和別的類共享,或只是引用別的類里的某個(gè)對(duì)象,所以生命周期不是很確定(這個(gè)可以考慮智能指針);
- 3)大數(shù)據(jù)類,如果定義成對(duì)象,會(huì)導(dǎo)致當(dāng)前對(duì)象無(wú)法在棧內(nèi)創(chuàng)建。
總結(jié)
以上是生活随笔為你收集整理的【C++】38.类成员变量声明为 对象与指针的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【数据结构与算法】7.位图算法、1230
- 下一篇: 【C++】39. std::ofstre