为什么`malloc`出来的内存也能当成对象正常使用
為什么malloc出來的對象也能正常使用
新學習C++語言的人會感覺到很疑惑,因為相比于C語言,C++多了個類;也正是這個類給很多人帶來了困擾,class究竟是什么,它和struct的差別又是什么?
結(jié)構(gòu)體我們能使用new申請,也能使用malloc申請使用都沒有問題,但是在類的創(chuàng)建教科書中給的方法是使用new進行創(chuàng)建。為什么一定要使用new進行創(chuàng)建?
搜索new和malloc的區(qū)別我們可以看到如下說明:
其實new內(nèi)部也是調(diào)用malloc實現(xiàn)的,只不過new更加智能,除了會自動計算出所需大小還會主動調(diào)用所申請對象構(gòu)造函數(shù)。
那么我們要是想使用malloc申請類對象,只需要保證申請的內(nèi)存夠用,然后手動調(diào)用成員函數(shù)對需要初始化或者賦值的數(shù)據(jù)進行賦值即可:
using namespace std; class Base { public:void SetData(int32_t data) {m_data = data;}int32_t GetData() const {return m_data;} private:int32_t m_data{12}; };// 調(diào)用malloc申請對象 Base* lpBase = static_cast<Base *>(malloc(sizeof(Base))); // 調(diào)用成員函數(shù) 對成員變量進行賦值 lpBase->SetData(12); // 取出成員變量并輸出 cout << lpBase->GetData() << endl; // output : 12從輸出結(jié)果可以看出,就算是malloc申請的內(nèi)存,也能正常的按照類使用,需要注意的是malloc申請內(nèi)存時沒有調(diào)用構(gòu)造函數(shù)
注意
博客發(fā)出后有人問我,為什么使用malloc申請的一塊內(nèi)存能夠調(diào)用對象的成員函數(shù),成員函數(shù)不應該是屬于對象的嗎?
這里說明一下,對象的實現(xiàn)是比C語言里面的類實現(xiàn)復雜了點,但是也沒有想象中的那么復雜,所有類的成員函數(shù)也好,靜態(tài)函數(shù)也好,都和是否創(chuàng)建對象無關,都只有一份。類的成員函數(shù)需要必須需要類對象調(diào)用的原因是因為,成員函數(shù)在調(diào)用的時候必須傳入this指針,你通過lpData調(diào)用成員函數(shù)時,就是把lpData當成this指針傳給SetData等成員函數(shù)了,因此malloc申請的“對象”也能正常調(diào)用類的成員函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的为什么`malloc`出来的内存也能当成对象正常使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面向对象】可变对象和不可变对象
- 下一篇: 许海燕(1987-),女,宁波市智慧城市