D語言中的特徵(Attributes)

特徵

	特徵指示器:
	    特徵 :
	    特徵 聲明定義塊
	    編譯器指令 ;

	其他特徵指示器:
	    其他特徵:
	    其他特徵 聲明定義塊
	    其他特徵 聲明定義塊 else 聲明定義塊

	特徵:
	    鏈接特徵
	    對齊特徵
	    編譯器指令
	    deprecated
	    private
	    package
	    protected
	    public
	    export
	    static
	    final
	    override
	    abstract
	    const
	    auto

	其他特徵:
	    調試特徵
	    版本特徵

	聲明定義塊
	    聲明定義
	    { }
	    { 聲明定義 }
	AttributeSpecifier:
	    Attribute :
	    Attribute DeclDefBlock
	    Pragma ;

	AttributeElseSpecifier:
	    AttributeElse :
	    AttributeElse DeclDefBlock
	    AttributeElse DeclDefBlock else DeclDefBlock

	Attribute:
	    LinkageAttribute
	    AlignAttribute
	    Pragma
	    deprecated
	    private
	    package
	    protected
	    public
	    export
	    static
	    final
	    override
	    abstract
	    const
	    auto

	AttributeElse:
	    DebugAttribute
	    VersionAttribute

	DeclDefBlock
	    DeclDef
	    { }
	    { DeclDefs }	
特徵用來修飾所聲明的一個或多個方法。通常的形式是:
	attribute declaration;	

	attribute:		
	    declaration;
	    declaration;
	    ...

	attribute			
	{
	    declaration;
	    declaration;
	    ...
	}
	
對於出現在可選的 else 子句中的聲明:
	attribute
	    declaration;
	else
	    declaration;

	attribute			
	{
	    declaration;
	    declaration;
	    ...
	}
	else
	{
	    declaration;
	    declaration;
	    ...
	}
	

鏈接特徵

	鏈接特徵:
		extern
		extern ( 鏈接類型 )

	鏈接類型:
		C
		D
		Windows
		Pascal
	LinkageAttribute:
		extern
		extern ( LinkageType )

	LinkageType:
		C
		D
		Windows
		Pascal
	
D 提供了一種方便的調用 C 函數和操作系統 API 函數的方法,因爲對這兩者的兼容都是必要的。鏈接類型 是大小寫敏感的,並且可以由實現擴展(它們不是關鍵字)。CD 是必須提供的,其他的含義由實現定義。實現註記:對於 Win32 平臺來說,應該支持 WindowsPascal

通過下面的方式指定 C 函數調用約定:

	 (C):
		 foo();	
D 調用約定是:
	 (D):
	
或者:
	:
	
Windows API 調用約定是:
	 (Windows):
	     *VirtualAlloc(
	     *lpAddress,
	     dwSize,
	     flAllocationType,
	     flProtect
	    );
	

對齊特徵

	對齊特徵:
		align
		align ( 整數 )
	
	AlignAttribute:
		align
		align ( Integer )
	
指定結構成員如何對齊。如果只有 align ,則設爲默認值,即使用同對應的 C 編譯器相同的默認對齊值。整數 指定了對齊的值,它的行爲同對應的 C 編譯器使用非默認的對齊值時相同。如果值爲 1 就表示不進行對齊;成員將緊挨在一起。

廢棄特徵

我們經常會將庫中的某一特徵標記爲廢棄,同時仍然保留它以保持向後兼容。這類聲明可以被標記爲廢棄,這意味着可以通過設置編譯器選項,在遇到引用這類聲明的代碼時產生錯誤:
	
	{
		 oldFoo();
	}
	
實現註記: 編譯器應該有一個選項用來指定是否被廢棄的特徵可以通過編譯。

保護特徵

用於保護的特徵有 privatepackageprotectedpublicexport

private 意味着只有本類內的及本類所在模塊內的成員可以訪問被保護的成員。私有成員不能被重寫。私有模塊成員等價於 C 程序中的 static 聲明。

package 擴展了 private 的訪問權,這樣包中的成員就可以訪問位於同一包內的其他的模塊內的成員。如果包是嵌套的話,這條規則只應用於最內層的包。

protected 意味着只有本類內或者派生類內的成員或者本類所在模塊內的成員可以訪問被保護的成員。protected 不能用於模塊成員。

public 意味着可執行程序中的任何代碼都可以訪問這個成員。

export 意味着可執行程序外的任何代碼都可以訪問這個成員。export 的意思也就是從 DLL 中導出定義。

Const 特徵

	const
	
const 特徵聲明可以在編譯時估值的常量。例如:
	  foo = 7;

	
	{
	     bar = foo + 6;
	}
	

Override 特徵

	override
	
override 特徵用於虛函數。這意味着必須用具有同基類中相同的名字和參數覆蓋這個函數。當某個基類的成員函數的參數變化的時候,override 特徵可以用來捕獲錯誤。這樣所有派生類會得知必須更新它們的覆蓋函數。
	 Foo
	{
	     bar();
	     abc( x);
	}

	 Foo2 : Foo
	{
	    
	    {
		 bar( c);		
		 abc( x);		
	    }
	}
	

Static 特徵

	static
	
static 特徵用於函數和數據。這意味着這個聲明不會應用於一個對象的特定實例,而應用於對象的類型。換句話說,這意味着沒有 this 引用。當用於其他聲明時,static 會被忽略。
	 Foo
	{
	      bar() {  6; }
	     foobar() {  7; }
	}

	...

	Foo f =  Foo;
	Foo.bar();	
	Foo.foobar();	
	f.bar();		
	f.foobar();	
	
靜態函數決不會是虛的。

在整個程序中,靜態數據只有一個實例,而不是每個對象有一個。

static 與在 C 中不同,它並不同時意味着它的作用域侷限在本文件中。你可以使用 private 特徵做到這一點。例如:

	 foo;
	 x = 3;		
	  y = 4;		
	
static 可以被應用於構造函數和析構函數,這樣就得到靜態構造函數和靜態析構函數。

Auto 特徵

	auto
	
auto 特徵用於局部變量和類聲明。對於類聲明來說,auto 特徵創建了一個 auto 類。對於局部聲明來說,auto 實現了 RAII(資源獲得即初始化)協議。這意味着當指向對象的 auto 引用脫離作用域的時候會自動調用它的析構函數。即使是由於拋出了異常而脫離作用域也會調用析構函數,因此 auto 用來保證清除。

auto 不能被用於全局的、靜態的數據成員或者用 inout 或 out 修飾的參數。auto 的數組是非法的,函數返回值也不允許是 auto 的。如果不是初始化的話,是不允許對 auto 賦值的。註記:如果將來出現了某種強制性的要求,這些限制可能會放鬆。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章