堆和棧的區(qū)別 拷貝構(gòu)造函數(shù)、構(gòu)造函數(shù)和賦值語句的區(qū)別?
拷貝構(gòu)造函數(shù)、構(gòu)造函數(shù)和賦值語句的區(qū)別?像這樣編寫構(gòu)造函數(shù)沒什么錯,但通常使用const。例如,調(diào)用非常量構(gòu)造函數(shù)沒有問題:錯誤原因是func()返回一個rvalue,它不能綁定到非常量構(gòu)造函數(shù),但可
拷貝構(gòu)造函數(shù)、構(gòu)造函數(shù)和賦值語句的區(qū)別?
像這樣編寫構(gòu)造函數(shù)沒什么錯,但通常使用const。例如,調(diào)用非常量構(gòu)造函數(shù)沒有問題:
錯誤原因是func()返回一個rvalue,它不能綁定到非常量構(gòu)造函數(shù),但可以是常量構(gòu)造函數(shù)。
在類a中定義復制構(gòu)造函數(shù)后,編譯器將不再生成默認常量構(gòu)造函數(shù),因此無法找到合適的復制構(gòu)造函數(shù)。
什么是拷貝構(gòu)造函數(shù)?拷貝構(gòu)造函數(shù)何時被調(diào)用?
在C中,以下三種對象需要調(diào)用復制構(gòu)造函數(shù)(有時也稱為“復制構(gòu)造函數(shù)”):
1)作為函數(shù)參數(shù)的對象通過值傳遞傳遞傳遞到函數(shù)體中;
2)作為函數(shù)返回值的對象通過值傳遞從函數(shù)返回;
3)使用對象初始化另一個對象(通常稱為賦值初始化);直接調(diào)用函數(shù)和在定義時定義后續(xù)調(diào)用有什么區(qū)別?這不是區(qū)別。困難的方法是在編譯器復制S1時調(diào)用S2復制方法。
有自己定義拷貝構(gòu)造函數(shù)的必要嗎?
1確實提供了復制構(gòu)造函數(shù),但此函數(shù)嚴格按位復制。一旦類中有動態(tài)分配成員,這將是一個問題(通常稱為深度復制),這是不正確的
2如果沒有動態(tài)分配成員,這是不必要的。但是動態(tài)分配成員是必要的,也是必要的,它還需要完成賦值運算符和析構(gòu)函數(shù)的重載,這樣當有動態(tài)分配成員時就不會有內(nèi)存泄漏
當一個初始化的自定義類類型對象被用來初始化另一個新構(gòu)造的對象時,會自動調(diào)用復制構(gòu)造函數(shù)。換句話說,當需要復制類的對象時,將調(diào)用復制構(gòu)造函數(shù)。在以下情況下將調(diào)用復制構(gòu)造函數(shù):通過值傳遞將對象傳遞到函數(shù)體中,通過值傳遞從函數(shù)返回對象。一個對象需要由另一個對象初始化。如果復制構(gòu)造函數(shù)沒有在類中顯式聲明,編譯器將自動生成一個默認的復制構(gòu)造函數(shù),它完成對象之間的位復制(淺層復制)。在某些情況下,類中的成員變量需要動態(tài)打開堆內(nèi)存。如果實現(xiàn)了位復制,也就是說,一個對象中的值被完全復制到另一個對象,比如a=B。此時,如果B中的成員變量指針已經(jīng)應用了內(nèi)存,那么a中的成員變量也指向同一個內(nèi)存塊。這會導致一個問題:當B釋放內(nèi)存(例如destruct)時,a中的指針是一個野生指針,并且會發(fā)生運行錯誤。