C++多態與虛擬:Objects 實例化(Objects Instantiation)探究

来源:https://www.cnblogs.com/ruanchunyi/p/18162474
-Advertisement-
Play Games

一、Objects的創建 依據已有的class CPoint ,我們可以產生一個或多個object(對象),或者說是產生一個instance(實體): CPoint aPoint(7.2); // aPoint._x 初始值為 7.2 aPoint.x(5.3); // aPoint._x 現值為 ...


一、Objects的創建 

  依據已有的class CPoint ,我們可以產生一個或多個object(對象),或者說是產生一個instance(實體):

CPoint aPoint(7.2); // aPoint._x 初始值為 7.2
aPoint.x(5.3); // aPoint._x 現值為 5.3

  這樣的objects可能放在函數的stack之中(對象是在函數內部創建的,例如在函數的作用域內),也有可能放在程式的data segment中(對象是在函數外部創建的,例如在全局作用域或靜態作用域內)。我們也可以這樣來產生一個objects:

CPoint* pPoint = new CPoint(3.6); // pPoint->_x 初 值 為 3.6
pPoint->x(5.3); // pPoint->_x 現值為 5.3
delete pPoint;

  使用new operator產生的objects,是放在程式的heap(堆)之內。

  不管哪一種方式來產生objects,我們依據某個class產生一個object的動作稱為instantiation(實例化)。object的誕生和死亡時,會自動調用class中特殊的member function,稱為constructor 和 destructor。

  Constructor:object誕生時會自動調用的class member functions稱為構造函數,此函數的命名必須與class相同,參數可以自定,沒有返回值。class可以有一個以上的constructors,其中無參數的那個稱為default constructor;只有一個參數,並且以該class為參數類型的,稱為copy constructor。

  Destructor :object生命結束時會自動調用的class member function稱為析構函數,一個class只能有一個destructor,沒有參數,沒有返回值,其命名必須與class相同,並以~為前置符號。

二、Objects 的生命Scope of Objects

    由於objects可能位於stack或heap或data segment之中,所以objects的生命周期就有差異。

  1. 放在stack之中的稱為local objects,它的生命隨著objects的產生產而開始,隨著所在函數的執行結束而結束。

  2.放在data segment之中的稱為gobal objects,它的生命隨著程式的開(比程式進入點還早),隨著程式的結束而結束。

  3.放 在heap之中的稱為heap objects,它的生命隨著new operator而開始,隨著delete operator而結束。    

  下麵這個例子出現了剛剛所提到的三種不同的生命周期的objects。從程式的執行結果,我們可以清楚的看到三種objects的生命範圍。其中用到的constructors(構造函數)和destructors(析構函數)。這個例子出現剛剛所提的三種不同生命週期的 objects。從程式的執行結果,
我們可以清楚看到三種 objects 的生命範圍。其中用到的 constructors(建構式) destructors。

#include <iostream.h>
#include <string.h>
class CDemo
{
  public:
     CDemo(const char* str); // constructor
     ~CDemo(); // destructor
  private:
     char name[20];
};
 CDemo::CDemo(const char* str) // constructor
{
  strncpy(name, str, 20);
   cout << "Constructor called for " << name << '\n';
 }
CDemo::~CDemo() // destructor
{
   cout << "Destructor called for " << name << '\n';
}
void func()
{
   CDemo LocalObjectInFunc("LocalObjectInFunc"); 
  static CDemo StaticObject("StaticObject"); 
  CDemo* pHeapObjectInFunc = new CDemo("HeapObjectInFunc"); 
  cout << "Inside func" << endl; 
 }
CDemo GlobalObject("GlobalObject"); 
void main()
{
   CDemo LocalObjectInMain("LocalObjectInMain"); 
   CDemo* pHeapObjectInMain = new CDemo("HeapObjectInMain"); 
   cout << "In main, before calling func\n"; 
   func();
   cout << "In main, after calling func\n"; 
}

  執行結果如下(註意,上例有new的動作,卻沒有delete,是個錯誤示範):

1. Constructor called for GlobalObject 
2. Constructor called for LocalObjectInMain 
3. Constructor called for HeapObjectInMain 
4. In main, before calling func 
5. Constructor called for LocalObjectInFunc 
6. Constructor called for StaticObject 
7. Constructor called for HeapObjectInFunc 
8. Inside func 
9. Destructor called for LocalObjectInFunc 
10. In main, after calling func 
11. Destructor called for LocalObjectInMain 
12. Destructor called for StaticObject 
13. Destructor called for GlobalObject 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.現象 當在vue中列印對象的時候會發現有一些屬性或者全部屬性都是顯示的...,點擊展開後才能看到真正的值是什麼. 2.原因 因為在vue中對象都是用了代理重寫了get,由於get重寫也就導致了瀏覽器不能直接獲取到具體的值,因此才會在列印的時候為...,手動點擊展開才顯示具體的值 3.想看具體的值 ...
  • 項目結構 在開發Chrome插件時,以下幾個文件的作用如下: manifest.json:這是Chrome插件的清單文件,用於配置插件的基本信息、許可權、頁面跳轉等。其中包括插件的名稱、版本號、圖標、後臺腳本、瀏覽器動作等信息。 background.js:這是Chrome插件的後臺腳本文件,用於處理 ...
  • DevTools 非常強大除了常用的查看元素,進行斷點調試或許還有些你不知道的小技巧,小功能。如可以快速的重新發送請求,快速選擇元素,在控制臺中使用npm庫等,讓你能夠更加高效的進行開發。不定時更新~ ...
  • 大家好,我是 Java陳序員。 在日常的工作生活中,我們經常會遇到應付各類強制要求轉發朋友圈的行為,或者是朋友圈集贊的行為。 今天,給大家介紹一個工具,可以幫助你生成朋友圈轉發截圖。 關註微信公眾號:【Java陳序員】,獲取開源項目分享、AI副業分享、超200本經典電腦電子書籍等。 項目介紹 We ...
  • 拖放功能,即將一個元素從一個區域,通過拖拽,放置到另一個區域。常見的應用是將文件或圖片從一個區域,拖放到另一個區域。中文常常把這表述成拖拽,實際上拖拽的描述並不准確,應該叫拖放,因為drag事件和drop事件是成對使用的,即拖拽和放置。 drag在拖拽動作發生時觸發,攜帶被拖拽元素的信息,drop在 ...
  • 1. computed(計算屬性)和方法有什麼區別? 計算屬性本質上是包含 getter 和 setter 的方法 當獲取計算屬性時,實際上是在調用計算屬性的 getter 方法。vue 會收集計算屬性的依賴,並緩存計算屬性的返回結果。只有當依賴變化後才會重新進行計算。 方法沒有緩存,每次調用方法都 ...
  • 大家好,我是 Java陳序員。 今天,給大家介紹一個簡潔、開源的中後臺管理模板項目。 關註微信公眾號:【Java陳序員】,獲取開源項目分享、AI副業分享、超200本經典電腦電子書籍等。 項目介紹 nova-admin —— 一個基於Vue3、Vite5、Typescript、Naive UI, 簡 ...
  • Util UI 已經開發多年, 併在多家公司的項目使用. 不過一直以來, Util UI 存在一些缺陷, 始終未能解決. 最近幾個月, Util 團隊下定決心, 終於徹底解決了所有已知缺陷. Util 應用框架 UI 介紹 Util 應用框架 UI 建立在 Angular , Ng-Zorro, N ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...