Cpp 对象模型探索 / new 对象时加括号和不加括号时的差别
一、結(jié)論
CTest *pt1 = new CTest(); CTest* pt2 = new CTest;1、若類 CTest 是空類,則二者?new 的結(jié)果沒有區(qū)別。
2、若類存在顯示聲明的缺省的構(gòu)造函數(shù),則二者 new 的結(jié)果沒有區(qū)別。
3、若類沒有顯示聲明的缺省的構(gòu)造函數(shù),即使編譯器為類創(chuàng)建了缺省的構(gòu)造函數(shù),二者的結(jié)果依然不一樣。帶括號(hào)的結(jié)果是會(huì)將 pt1 的 count_ 初始化為0,而不帶括號(hào)的結(jié)果是不初始化?count_ 。
二、驗(yàn)證
1、對(duì)于空類,其對(duì)象只占1B,兩種申請(qǐng)方式?jīng)]有區(qū)別。
2、對(duì)于類存在顯示聲明的缺省的構(gòu)造函數(shù),兩種 new 的時(shí)候都會(huì)調(diào)用該構(gòu)造函數(shù),所以對(duì)于 new 的結(jié)果沒有影響。
#include <iostream>class CTest { public:CTest(){count_ = 0;} public:size_t count_; };int main() {CTest *pt1 = new CTest();CTest* pt2 = new CTest;std::cout << "()::count_ = " << pt1->count_ << std::endl;std::cout << "count_ = " << pt2->count_ << std::endl;std::cin.get();return 0; }結(jié)果
()::count_ = 0 count_ = 0?3、對(duì)于沒有顯式聲明構(gòu)造函數(shù)的類,即使編譯器自動(dòng)生成了一個(gè)構(gòu)造函數(shù),二者 new 的結(jié)果也是不同的。帶括號(hào)的 new 會(huì)對(duì)類中成員變量進(jìn)行初始化,而不帶括號(hào)的 new 則不采取任何操作。
#include <iostream>class CTest { public:size_t count_; public:virtual void func(){} };int main() {CTest *pt1 = new CTest();CTest* pt2 = new CTest;std::cout << "()::count_ = " << pt1->count_ << std::endl;std::cout << "count_ = " << pt2->count_ << std::endl;std::cin.get();return 0; }結(jié)果
()::count_ = 0 count_ = 3452816845?
(SAW:Game Over!)
總結(jié)
以上是生活随笔為你收集整理的Cpp 对象模型探索 / new 对象时加括号和不加括号时的差别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cpp 对象模型探索 / 静态联编和动态
- 下一篇: Cpp 对象模型探索 / new 运算符