結構體宣告的方式 及類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標頭檔案中