C++:構(gòu)造函數(shù)中的new和返回對象和指向類的指針(第十二章)

構(gòu)造函數(shù)使用new注意事項(xiàng):

  1. 如果在構(gòu)造函數(shù)使用new來初始化指針,則在析構(gòu)函數(shù)使用delete
  2. new和delete要對應(yīng)。new對應(yīng)delete,new [] 對應(yīng)delete []
  3. 如果有多個構(gòu)造函數(shù),必須以相同的方式使用new,因?yàn)橹挥幸粋€析構(gòu)函數(shù)。默認(rèn)構(gòu)造函數(shù)將它設(shè)置為nullptr或0

有關(guān)返回對象的說明

  1. 返回指向const對象的引用
    使用const引用旨在提高效率
    返回引用不會調(diào)用復(fù)制函數(shù)
    引用指向?qū)ο髴?yīng)該在調(diào)用函數(shù)執(zhí)行時存在,執(zhí)行完畢后引用的對象也應(yīng)該存在
    一般返回的是參數(shù),參數(shù)有const,返回對象引用也是const類型

  2. 返回非const對象的引用
    重載賦值運(yùn)算符、以及重載運(yùn)算符<<與cout一起使用返回的ostream引用都不用const

  3. 返回對象
    如果被返回的對象是被調(diào)用函數(shù)中的局部變量,則不應(yīng)該按引用方式返回它
    比如operator+返回的是局部變量對象,返回對象,則程序?qū)?chuàng)建一個新對象副本,調(diào)用復(fù)制構(gòu)造函數(shù)復(fù)制到新對象副本上供程序訪問。然后析構(gòu)函數(shù)將局部對象delete。

  4. 返回const對象
    f1 + f2 = f3(假如f都是類對象),這樣的語句如果是一個返回對象的operator+重載運(yùn)算符是可行的。他將使用+將f1和f2相加,然后賦值運(yùn)算符將f1+f2用f3覆蓋。
    將返回類型設(shè)置為const對象,則可避免發(fā)生錯誤

總結(jié):

  1. 如果方法或函數(shù)要返回局部變量,則返回類型為對象而不是引用。這種情況下將調(diào)用復(fù)制構(gòu)造函數(shù)來生成返回的對象。
  2. 如果方法要返回一個沒有公有復(fù)制構(gòu)造函數(shù)的類,如ostream、istream,則返回對象一定是對象的引用。
  3. 如果方法或函數(shù)兩個都行,返回引用。

指向類的指針

  1. 使用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刪除
  2. 下面這個將調(diào)用默認(rèn)構(gòu)造函數(shù)
    class_name* pte = new class_name;

指針和對象小結(jié)

  1. String* ptr 聲明為指向類的對象
  2. String* ptr = &str 將指針初始化為已有對象
  3. String* ptr = new String 使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對象對指針initialize
  4. String* ptr = new String("Hi")使用new和String(const char*)類構(gòu)造函數(shù)初始化指針
  5. String* ptr = new String(String_object)使用new和String(const String& ) 類構(gòu)造函數(shù)初始化指針
  6. if(saying[i].length < shortest->length)使用->操作符通過指針訪問類方法
  7. if(sayings<*first)使用*解引用操作符從指針獲得對象

使用new創(chuàng)建對象原理:比如String* ptr= new String("hi")

  1. 為對象分配一塊內(nèi)存(比如x2400)
  2. 調(diào)用類構(gòu)造函數(shù),為''hi''分配內(nèi)存(x2000),然后將x2000賦值給str,將長度2賦值給len,更新num_str值。
  3. 創(chuàng)建ptr變量
  4. 將新對象地址(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;
  1. 注意使用定位new時,要注意分配的內(nèi)存是否已經(jīng)被占用,否則將覆蓋原始數(shù)據(jù)(因?yàn)椴皇莂utomatic的)
  2. 存放在heap中的,要使用delete刪除
  3. 存放在數(shù)組內(nèi)存里的,只要delete掉這一塊數(shù)組內(nèi)存就好.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容