1. 程式人生 > 實用技巧 >結構體宣告的方式 及類namespace的前置宣告

結構體宣告的方式 及類namespace的前置宣告

前置宣告一般用於要在一個類中使用另一個類,而另一個類的宣告在後面或者其他檔案中時

如類A和B

class A{

private:

B *b;

};

class B{

};這裡類B在類A後面,但是類A中建立類B的指標了,所以要在類A前宣告類B,將上面改成

class B;

class A{

private:

B *b;

};

class B{

};雖然這裡聲明瞭在類A前面聲明瞭類B,但是並不能在類A中建立類B的物件或者使用類B的方法

namespace就是名稱空間,可以在其中定義變數和函式等等

#include<iostream>

using namespace std;

namespace A{

void Print();

void A::Print(){

cout<<"From namespace A"<<endl;

}

namespace B{

String a="From namespace B";

void Print(){

cout<<a<<endl;

}

}

using namespace B;

int main()

{

Print();

A::Print();

Print();

return 0;

}

上面這段程式的執行結果應該是輸出

From namespace B

From namespace A

From namespace B

主函式中第一個Print執行的是namespace B中的函式Print,因為在主函式之前有一條語句using namespace B;,這裡表明了使用名稱空間B,所以直接呼叫Print函式就是B中的,後面A::Print()則是直接使用域作用符::來訪問namespace A中的Print函式,而在這後面又直接訪問Print函式,因為域作用符只是本次有效,故第三個Print函式呼叫是直接訪問了namspace B中的Print函式。

假若在第三個Print函式和return 0之間加入

using namespace A;

Print();

那麼就會報錯call of overloaded 'Print()' is ambiguous|

那是因為這裡的using namespace A;雖然使用了A名稱空間,但是實際上並不會在後面遮蔽B名稱空間,所以呼叫Print函式就會不清楚呼叫的A中的還是B中的

namespacens

{

………//將內容新增到名稱空間中

}

using namespace ns;

……..//宣告名稱空間後,表示ns名稱空間裡面的內容對於這條聲明後的程式碼是可見的。

但是如果聲明瞭兩個名稱空間ns1,ns2。且ns1和ns2中包含相同的全域性變數,或函式或類,那麼就可能會產生衝突。

using namespace ns1;

using namespace ns2;

………//若使用了ns1和ns2中相同部分會產生衝突。

解決方法:指定名稱空間。例:ns1::變數名

結構體宣告的幾種方式

1.先宣告結構體型別,再定義結構體變數

/*圖書的結構體型別宣告*/
struct Book
{
    char ISBN[20];	   //圖書的ISBN碼。
	char name[50];   //圖書名稱。
	float price;   //價格
};
/*結構體變數定義*/
struct Book book1;   //book1 為結構體變數。
  • 2.宣告結構體型別,同時定義結構體變數
/*圖書的結構體型別宣告*/
struct Book  
{
	char ISBN[20];	   //圖書的ISBN碼。
	char name[50];   //圖書名稱。
	float price;   //價格
}book2;    // book2 為結構體變數
/*再次定義一個結構體變數 book3 */
struct Book book3;   //book3 為結構體變數。
  • 3.不宣告結構體型別,直接定義結構體變數
/*圖書的結構體型別宣告*/
struct  
{
	char ISBN[20];	   //圖書的ISBN碼。
	char name[50];   //圖書名稱。
	float price;   //價格
}book4;    // book4 為結構體變數
//但這樣宣告結構體型別後,就不可再定義新的結構體變量了。
  • 4.使用typedef宣告結構體型別,再定義結構體變數
/*圖書的結構體型別宣告 typedef 方式一*/
typedef struct Book  
{
	char ISBN[20];	   //圖書的ISBN碼。
	char name[50];   //圖書名稱。
	float price;   //價格
}strBook;    // strBook為結構體型別

/*定義一個結構體變數 */
struct Book book5;   //book5 為結構體變數。
strBook book6;  //book6 為結構體變數。

/*圖書的結構體型別宣告 typedef 方式二 */
typedef struct  
{
	char ISBN[20];	   //圖書的ISBN碼。
	char name[50];   //圖書名稱。
	float price;   //價格
}strBook;    // strBook為結構體型別

/*定義一個結構體變數 */
strBook book6;  //book7 為結構體變數。

在使用 typedef struct {…}strBook;宣告結構體型別時需要注意的是和直接 struct Book {}book2; 的區別,strBook 是結構體型別,而book2是結構體變數。(第4中方式二第2的區別)。在實際編碼過程中常見的方式是選用第4的方式二進行程式設計。

類的宣告 , 類和結構體的區別 , 行內函數

#include<iostream>

using namespace std;

class A;//類的宣告

class B

{

private:

A *a;//必須是指標 ,不能為 A a;

};

class A

{

private:

B b;

};

int main()

{}

類和結構體區別:

結構體預設public

類預設是private

在繼承方式:結構體預設公有繼承

類預設私有繼承

inline

呼叫行內函數並沒有執行函式的呼叫過程,只是把函式的程式碼嵌入到了程式的呼叫點 , 減少了函式的呼叫過程。

一般把行內函數寫在.h標頭檔案中