C++對象的使用:四種對象生存期和作用域、static 用法總結
一、四種對象生存期和作用域
棧對象
隱含調用構造函數(程序中沒有顯式調用)
堆對象
隱含調用構造函數(程序中沒有顯式調用),要顯式釋放
全局對象、靜態全局對象
全局對象的構造先於main函數
已初始化的全局變數或靜態全局對象存儲於.data段中
未初始化的全局變數或靜態全局對象存儲於.bss段中
靜態局部對象
已初始化的靜態局部變數存儲於.data段中
未初始化的靜態局部變數存儲於.bss段中
C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#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;
}
二、static 用法總結
1. 用於函數內部修飾變數,即函數內的靜態變數。這種變數的生存期長於該函數,使得函數具有一定的「狀態」。使用靜態變數的函數一般是不可重入的,也不是線程安全的,比如strtok(3)。
2. 用在文件級別(函數體之外),修飾變數或函數,表示該變數或函數只在本文件可見,其他文件看不到也訪問不到該變數或函數。專業的說法叫「具有internal linkage」(簡言之:不暴露給別的translation unit)。
C語言的這兩種用法很明確,一般也不容易混淆。
由於C++引入了類,在保持與C語言兼容的同時,static關鍵字又有了兩種新用法:
3.用於修飾類的數據成員,即所謂「靜態成員」。這種數據成員的生存期大於class的對象(實例/instance)。靜態數據成員是每個class有一份,普通數據成員是每個instance 有一份。
4. 用於修飾class的成員函數,即所謂「靜態成員函數」。這種成員函數只能訪問靜態成員和其他靜態成員函數,不能訪問非靜態成員和非靜態成員函數。


※android 訪問webservice(解析一行代碼實現)
※mybatis與spring整合:Dao層映射配置
TAG:程序員小新人學習 |