程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳談C++何時需求定義賦值/復制結構函數

詳談C++何時需求定義賦值/復制結構函數

編輯:關於C++

詳談C++何時需求定義賦值/復制結構函數。本站提示廣大學習愛好者:(詳談C++何時需求定義賦值/復制結構函數)文章只能為提供參考,不一定能成為您想要的結果。以下是詳談C++何時需求定義賦值/復制結構函數正文


承繼和靜態內存分配

假定基類運用了靜態內存分配,而且定義了析構函數、復制結構函數和賦值函數,但是在派生類中沒有運用靜態內存分配,那麼在派生類中不需求顯示定義析構函數、復制結構函數和賦值函數。

當基類和派生類采用靜態內存分配時,派生類的析構函數、復制結構函數、賦值運算符都必需運用相應的基類辦法來處置基類元素。這種要求是經過三種不同的方式來滿足的。關於析構函數。這是自動完成的,也就是說在派生類的析構函數中無需顯示調用基類的析構函數。關於結構函數,這是經過在初始化成員列表中調用基類的復制結構函數來完成的,假如不這樣做,將自動調用基類的默許結構函數,關於賦值運算符,這是經過運用域解析運算符顯示地調用基類的賦值運算符來完成的。

編譯器生成的成員函數

1、  默許結構函數

默許結構哈數要麼沒有參數,要麼一切的參數都有默許值。假如沒有定義任何結構函數,編譯器將定義結構函數。另外,假如派生類結構函數的成員初始化列表中沒有顯示調用基類結構函數,則編譯器將運用基類的默許結構函數來結構派生類對象的基類局部。在這種狀況下,假如基類沒有結構函數,將招致編譯階段錯誤。假如定義了某種結構函數,編譯器將不會定義默許結構函數。在這種狀況下,假如需求默許結構函數,則必需自己提供。(最好的建議就是,一旦自己定義了結構函數,那麼最好再定義一個默許的結構函數,這樣在別的子類中調用也十分的方便)

提供結構函數的動機之一是確保對象總能被正確地初始化。另外,假如類包括指針成員,則必需初始化這些成員。因而,最好提供一個顯示默許結構函數,將一切的類數據成員初始化為合理的值。

2、  復制結構函數

復制結構函數承受其所屬類的對象作為參數。在下述狀況下,將運用復制結構函數

將新對象初始化為一個同類對象
按值將對象傳遞給函數
函數按值前往對象
編譯器生成暫時對象

假如順序沒有運用復制結構函數,編譯器將提供原型,但不提供函數定義,否則,順序將定義一個執行成員初始化的賦值結構函數。也就是說,新對象的每個成員都被初始化為原始對象相應成員的值。假如成員為類對象,則初始化該成員時,將運用相應類的復制結構函數。

假如運用new初始化的成員指針通常要求執行深度復制,或許類能夠包括需求修正的靜態變量。在上述狀況下,需求定義自己的復制結構函數。

3、  賦值結構函數

默許的賦值運算符用於處置同類對象之間的賦值。不要將賦值與初始化混雜了。假如語句創立新的對象,則運用初始化,假如語句修正已有對象的值,則是賦值。

默許賦值為成員賦值。假如成員為類對象,則默許成員賦值將運用相應類的賦值運算符。假如需求顯示定義復制結構函數,則基於相反的緣由。也需求顯示定義賦值運算符。
 
關於派生類而言,維護成員相似於共有成員,但關於內部而言,維護成員於公有成員相似。派生類可以直接訪問基類的維護成員,但只能經過基類的成員函數來訪問公有成員。
 
基類的析構函數該當是虛的。這樣,當經過指向對象的基類指針或援用來刪除派生對象時,順序將首先調用派生類的析構函數,然後調用基類的析構函數,而不只僅是調用基類的析構函數

如何判別一個指針指向的對象的真實類型,運用C++中的運轉機遇制,typeid就可以完成目的

以上就是為大家帶來的詳談C++何時需求定義賦值/復制結構函數全部內容了,希望大家多多支持~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved