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