程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中四種對象生計期和感化域和static的用法總結剖析

C++中四種對象生計期和感化域和static的用法總結剖析

編輯:關於C++

C++中四種對象生計期和感化域和static的用法總結剖析。本站提示廣大學習愛好者:(C++中四種對象生計期和感化域和static的用法總結剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中四種對象生計期和感化域和static的用法總結剖析正文


1、四種對象生計期和感化域


棧對象
隱含挪用結構函數(法式中沒有顯式挪用)

堆對象
隱含挪用結構函數(法式中沒有顯式挪用),要顯式釋放

全局對象、靜態全局對象

全局對象的結構先於main函數

已初始化的全局變量或靜態全局對象存儲於.data段中

未初始化的全局變量或靜態全局對象存儲於.bss段中

靜態部分對象

已初始化的靜態部分變量存儲於.data段中

未初始化的靜態部分變量存儲於.bss段中

#include <iostream>
using namespace std;
class Test
{
public:
    Test(int n) : n_(n)
    {
        cout << "Test " << n_ << " ..." << endl;
    }
    ~Test()
    {
        cout << "~Test " << n_ << " ..." << endl;
    }
private:
    int n_;
};
int n;          // 未初始化的全局變量,初始值為0。n存儲於.bss段中。(block started by symbol)
int n2 = 100;   // 已初始化的全局變量,初始值為100。n2存儲於.data段中。
Test g(100);        // 全局對象的結構先於main函數
static Test g2(200);
int main(void)
{
    cout << "Entering main ..." << endl;
    Test t(10);     // 棧上創立的對象,在生計期停止的時刻主動釋放
    {
        Test t(20);
    }
    {
        Test *t3 = new Test(30);        // 堆上創立的對象,要顯式釋放
        delete t3;
    }
    {
        static int n3;          // n3存儲於.bss段中      (編譯期初始化)
        static int n4 = 100;    // n4存儲於.data段中 (編譯期初始化)
        static Test t4(333);    // t4對象運轉期初始化   .data段
    }
    cout << "Exiting main ..." << endl;
}



2、static 用法總結
1. 用於函數外部潤飾變量,即函數內的靜態變量。這類變量的生計期擅長該函數,使得函數具有必定的“狀況”。應用靜態變量的函數普通是弗成重入的,也不是線程平安的,好比strtok(3)。

2. 用在文件級別(函數體以外),潤飾變量或函數,表現該變量或函數只在本文件可見,其他文件看不到也拜訪不到該變量或函數。專業的說法叫“具有internal linkage”(簡言之:不裸露給其余translation unit)。

C說話的這兩種用法很明白,普通也不輕易混雜。


因為C++引入了類,在堅持與C說話兼容的同時,static症結字又有了兩種新用法:
3.用於潤飾類的數據成員,即所謂“靜態成員”。這類數據成員的生計期年夜於class的對象(實例/instance)。靜態數據成員是每一個class有一份,通俗數據成員是每一個instance 有一份。

4. 用於潤飾class的成員函數,即所謂“靜態成員函數”。這類成員函數只能拜訪靜態成員和其他靜態成員函數,不克不及拜訪非靜態成員和非靜態成員函數。

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