結構體聲明的方式 及類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頭文件中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM