Static:靜態(tài)存儲(chǔ),內(nèi)部鏈接。
1.函數(shù)內(nèi)部的靜態(tài)變量內(nèi)部類型:在定義的時(shí)候初始化,如果未初始化,編譯器將其設(shè)置為0.
自定義類型:在定義的時(shí)候調(diào)用構(gòu)造函數(shù),如未傳遞參數(shù),調(diào)用默認(rèn)構(gòu)造函數(shù)。包含局部對(duì)象的函數(shù)如果未被調(diào)用,則該局部對(duì)象不會(huì)構(gòu)造,也不會(huì)析構(gòu)。
void f()
{
static Obj b('b');
}
void g()
{
Obj c('c');
}
int main()
{
return 0;
}// no constructor both c and b
內(nèi)部鏈接的好處是,可以將這個(gè)名字放在頭文件中而不用擔(dān)心鏈接時(shí)發(fā)生沖突。(鏈接時(shí)發(fā)現(xiàn)多個(gè)同一名字的定義會(huì)報(bào)錯(cuò),不知道該鏈接哪一個(gè)了)。通常將變量、內(nèi)聯(lián)函數(shù)放在頭文件中,因?yàn)檫@些默認(rèn)是內(nèi)聯(lián)的。
鏈接只引用那些在鏈接/裝載期間有地址的成員,因此類聲明和局部變量并不鏈接。
2.全局變量:
static int a = 0;//definition, internal linkage, static storage area
extern int b = 0;//definition,external linkage, static storage area
3。局部變量:static只改變變量的存儲(chǔ)類型。而extern只是用作聲明,表示某處已經(jīng)存在一個(gè)存儲(chǔ)區(qū)。
4。函數(shù)名:只改變可見性,static 僅該翻譯單元可見,extern(默認(rèn))外部可見。
名字空間解決沖突
1)只能在全局范圍內(nèi)定義,可以相互嵌套
2)定義結(jié)尾處不需要有分號(hào)
3)可以在多個(gè)頭文件中用一個(gè)標(biāo)識(shí)符
4)可以用另一個(gè)名字空間做別名
namespace longName
{
int i = 0;
}
namespace LN = longName;
5)不能創(chuàng)建實(shí)例
每個(gè)翻譯單元只能有一個(gè)未命名的名字空間,默認(rèn)為內(nèi)部鏈接。
namespace{
class A{};
class B{};
int i, j , k;
}
可以在一個(gè)名字空間的類定義之內(nèi)插入一個(gè)友元聲明,該友元自動(dòng)成為該名字空間的一員。
namespace Me
{
class Us{
friend void you();// you is member of namespace Me
};
}
使用名字空間
using 聲明
namespace U
{
inline void f(){}
inline void g(){}
}
namespae V
{
inline void f(){}
inline void g(){}
inline void g(int){}
inline char g(char){return 'a';}
}
void h()
{
using namespace U;
using V::g;//沒有類型方面的信息,聲明了這個(gè)空間中的所有重載函數(shù)
g();
g(1);
g('b');
U::g();
}
不要在頭文件中使用using namespace ...會(huì)污染所有包含該頭文件的編譯單元。
C++中的靜態(tài)成員
所有的類公用一塊內(nèi)存區(qū)域,可以進(jìn)行類內(nèi)部通信。如果一個(gè)靜態(tài)數(shù)據(jù)成員被聲明但是未被定義,連接器會(huì)報(bào)一個(gè)錯(cuò)誤。
定義必須出現(xiàn)在類的外部,且只能定義一次,通常放在類的實(shí)現(xiàn)文件中。
//.h file
class A
{
static int i ;
public:
//
};
//.cpp file
int A::i = 1;
這些都是類創(chuàng)建者應(yīng)該做的,所以,客戶程序員不需要再定義一次了。
靜態(tài)數(shù)組的初始化
在類外初始化
class Value{
static const int scSize = 100;//非常特殊,內(nèi)部類型可以這樣定義,也可以在類外定義。
static const float scFloat;
static const int scInts[];
};
const int Value::scFloat = 1.0f;
const int Value::scInts[]={2,23,4};
自定義類型: 必須在類外初始化
class Stat
{
static X x1;
static X xTable[];
static const X x2;
static const X xTable2[];
};
X Stat::x1(100);
X Stat::xTable[] = { X(1), X(2), X(3)};
const X Stat::x2(200);
const X Stat::xTable2 = {X(2), X(4), X(10) };
局部類中不能有static 數(shù)據(jù)成員。
靜態(tài)成員函數(shù):沒有隱含的this指針,所以不能調(diào)用非靜態(tài)成員函數(shù)。
靜態(tài)初始化的相依性:一個(gè)對(duì)象的初始化必須需要另一個(gè)對(duì)象先初始化,如果初始化順序不對(duì),則造成錯(cuò)誤。解決方法:利用函數(shù)
1.頭文件中聲明一個(gè)函數(shù),且不能為內(nèi)聯(lián)。
2.實(shí)現(xiàn)文件中定義一個(gè)靜態(tài)對(duì)象,并返回引用。
//Dependency1StatFunc.h
#include "Dependency1.h"
extern Dependency1& d1();
//Dependency2StatFunc.h
#include "Dependency2.h"
extern Dependency2& d2();
//Dependency1StatFunc.cpp
#include "Denpendency1StatFunc.h"
Dependency1& d1()
{
static Deppendency1 dep1;
return dep1;
}
//Dependency2StatFunc.cpp 靜態(tài)對(duì)象一般放在單獨(dú)的文件中定義,但要在頭文件中聲明。
#include "Denpendency1StatFunc.h"
#include "Denpendency2StatFunc.h"
Dependency2& d2()
{
static Deppendency2 dep2(d1());//調(diào)用d1()的時(shí)候dep1已經(jīng)初始化了
return dep2;
}
使用c類型的函數(shù)
extern "c" float f(int a);
extern "c"{
#include "Myheader.h"
}
extern "c"
{
float f();
double d();
}
posted on 2012-05-31 14:30
Dino-Tech 閱讀(140)
評(píng)論(0) 編輯 收藏 引用