構(gòu)造函數(shù)使用new注意事項(xiàng):
- 如果在構(gòu)造函數(shù)使用new來初始化指針,則在析構(gòu)函數(shù)使用delete
- new和delete要對應(yīng)。new對應(yīng)delete,new [] 對應(yīng)delete []
- 如果有多個構(gòu)造函數(shù),必須以相同的方式使用new,因?yàn)橹挥幸粋€析構(gòu)函數(shù)。默認(rèn)構(gòu)造函數(shù)將它設(shè)置為nullptr或0
有關(guān)返回對象的說明
返回指向const對象的引用
使用const引用旨在提高效率
返回引用不會調(diào)用復(fù)制函數(shù)
引用指向?qū)ο髴?yīng)該在調(diào)用函數(shù)執(zhí)行時存在,執(zhí)行完畢后引用的對象也應(yīng)該存在
一般返回的是參數(shù),參數(shù)有const,返回對象引用也是const類型返回非const對象的引用
重載賦值運(yùn)算符、以及重載運(yùn)算符<<與cout一起使用返回的ostream引用都不用const返回對象
如果被返回的對象是被調(diào)用函數(shù)中的局部變量,則不應(yīng)該按引用方式返回它
比如operator+返回的是局部變量對象,返回對象,則程序?qū)?chuàng)建一個新對象副本,調(diào)用復(fù)制構(gòu)造函數(shù)復(fù)制到新對象副本上供程序訪問。然后析構(gòu)函數(shù)將局部對象delete。返回const對象
f1 + f2 = f3(假如f都是類對象),這樣的語句如果是一個返回對象的operator+重載運(yùn)算符是可行的。他將使用+將f1和f2相加,然后賦值運(yùn)算符將f1+f2用f3覆蓋。
將返回類型設(shè)置為const對象,則可避免發(fā)生錯誤
總結(jié):
- 如果方法或函數(shù)要返回局部變量,則返回類型為對象而不是引用。這種情況下將調(diào)用復(fù)制構(gòu)造函數(shù)來生成返回的對象。
- 如果方法要返回一個沒有公有復(fù)制構(gòu)造函數(shù)的類,如ostream、istream,則返回對象一定是對象的引用。
- 如果方法或函數(shù)兩個都行,返回引用。
指向類的指針
- 使用new初始化一個指向類對象的指針
class_name* ptr = new class_name(value)
原理:new class_name(value)將調(diào)用如下構(gòu)造函數(shù):
class_name(type_name)或者class_name(const type_name)
這是為對象分配內(nèi)存,用一塊新內(nèi)存塊創(chuàng)造一個對象然后指針指向它。動態(tài)分配的內(nèi)存需要手動用delete刪除- 下面這個將調(diào)用默認(rèn)構(gòu)造函數(shù)
class_name* pte = new class_name;
指針和對象小結(jié)
String* ptr聲明為指向類的對象String* ptr = &str將指針初始化為已有對象String* ptr = new String使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對象對指針initializeString* ptr = new String("Hi")使用new和String(const char*)類構(gòu)造函數(shù)初始化指針String* ptr = new String(String_object)使用new和String(const String& ) 類構(gòu)造函數(shù)初始化指針if(saying[i].length < shortest->length)使用->操作符通過指針訪問類方法if(sayings<*first)使用*解引用操作符從指針獲得對象
使用new創(chuàng)建對象原理:比如
String* ptr= new String("hi")
- 為對象分配一塊內(nèi)存(比如x2400)
- 調(diào)用類構(gòu)造函數(shù),為''hi''分配內(nèi)存(x2000),然后將x2000賦值給str,將長度2賦值給len,更新num_str值。
- 創(chuàng)建ptr變量
- 將新對象地址(x2400)給ptr變量
定位new運(yùn)算符
char * buffer = new char [100];
String* ptr1 = new (buffer) String("hello");
String* ptr2 = new (buffer+10) String("Hi");
String* ptr3 = new String;
String* ptr4 = new String("Hello")
delete ptr3;
delete ptr4;
delete [] buffer;
- 注意使用定位new時,要注意分配的內(nèi)存是否已經(jīng)被占用,否則將覆蓋原始數(shù)據(jù)(因?yàn)椴皇莂utomatic的)
- 存放在heap中的,要使用delete刪除
- 存放在數(shù)組內(nèi)存里的,只要delete掉這一塊數(shù)組內(nèi)存就好.