C++中四種對象生計期和感化域和static的用法總結剖析。本站提示廣大學習愛好者:(C++中四種對象生計期和感化域和static的用法總結剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中四種對象生計期和感化域和static的用法總結剖析正文
棧對象
隱含挪用結構函數(法式中沒有顯式挪用)
堆對象
隱含挪用結構函數(法式中沒有顯式挪用),要顯式釋放
全局對象、靜態全局對象
全局對象的結構先於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的成員函數,即所謂“靜態成員函數”。這類成員函數只能拜訪靜態成員和其他靜態成員函數,不克不及拜訪非靜態成員和非靜態成員函數。