C++基礎----頭文件&using&命名空間namespace使用詳解---入門

1.頭文件

1.頭文件是什麼?

在這裏插入圖片描述

簡單描述頭文件作用:

  • 把需要用到的變量、函數等信息,羅列在頭文件裏面(可以理解爲新華字典裏面的每個漢字), 運行文件直接引用頭文件,然後就可以使用這個變量或者函數了。
  • 但是,具體這個函數是幹了哪些事情(這個漢字的詳細解釋),這個可以在其他文件裏面定義。
  • 這樣做的好處是:可以統籌管理所有變量和函數、找起來會比較快(例如第一行是函數名,第200行才結束,你看到201行才能找到第二個函數,豈不是非常麻煩)

看看專業的解釋:

  • 頭文件的主要作用在於多個代碼文件全局變量(函數)的重用、防止定義的衝突,對各個被調用函數給出一個描述,其本身不需要包含程序的邏輯實現代碼,它只起描述性作用,用戶程序只需要按照頭文件中的接口聲明來調用相關函數或變量,鏈接器會從庫中尋找相應的實際定義代碼。
    百度百科: 頭文件

2.C/C++頭文件啥區別?

c的頭文件都是以.h結尾,如stdio.h、math.h

c++的頭文件:

  • c++保留了c中的頭文件風格,即大部分c的頭文件都可以在c++中使用,也可以自定義c類型頭文件在c++中使用
  • c的標準頭文件在c++中去掉了.h後綴,添加了c前綴,如math.h改爲cmath
  • c++自身的頭文件,不帶後綴,如iostream,其最大的不同就是c++類型頭文件可以包含命名空間,而.h後綴的則不行

看到其他大神些的博客,頭文件最好不要使用命名空間namespace:
https://blog.csdn.net/qq_41230365/article/details/80191964

3.如何使用頭文件呢?

//header_02.h文件, 僅僅定義了一個函數

void alien();


// func.cpp源文件, 對函數alien有個詳細的實現

#include "header_01.h"
#include <iostream>
using namespace std;


void alien() {
	cout << "alien函數的實現" << endl;
	int age = 28;
	cout << age << endl;
}

// run.cpp源文件,這個是引用了頭文件,就可實現對函數的調用

#include <iostream>
#include <ctime>
#include "header_01.h"

int main()
{
	alien();
	cout << "hello主函數的實現" << endl;
}

//最終實現的結果爲:

alien函數的實現
28
hello主函數的實現

2.using關鍵字

1.聲明變量的作用

在使用using之前,如果全局變量和局域變量同時存在的時候,函數會自動使用全局變量。如果我們想使用的是局域變量,那就沒辦法了。


#include <iostream>
using namespace std;
int age = 28;

namespace alien {
    int age = 18;
}

void fun_01(){
    cout << age << endl;    
}

int main(){
    fun_01();
    getchar();
}

28
//因爲程序頭部,設置了全局變量28, 命名空間alien裏面,雖然也有一個age,但是算局域變量。
//最終, fun_01函數沒有在函數體裏面發現局域變量,就只能找到全局變量age了

如上情況,我們需要指明,要使用的是局域變量,using的作用就是這個,請看

#include <iostream>
using namespace std;
int age = 28;

namespace alien {
    int age = 18;
}

void fun_01(){
    using alien::age;			# 只是比上面添加了這一行代碼,就可以指明使用的是局域變量
    cout << age << endl;
    
}

int main(){
    fun_01();
    getchar();
}

18
// alien 命名空間下的age

局域變量和命名空間,不能在一個函數體裏面,這樣會導致函數有個【二義性】,函數不知道應該選擇哪個變量,最終報錯

#include <iostream>
using namespace std;

namespace alien {
    int age = 18;
}

void fun_01(){
    int age = 28;				//先指明一個變量
    using alien::age;			//再引用一個局域變量
    cout << age << endl;
    
}

int main(){
    fun_01();
    getchar();
}

函數會報如下的錯誤
在這裏插入圖片描述

2.編譯指令的作用

可以理解爲編譯指令----打開某個命名空間,方便下面代碼去使用次命名空間裏面的變量


#include <iostream>
using namespace std;

namespace alien {
    int age = 18;
}

void fun_01(){
    int age = 18;
    using namespace alien;			//此處相當於打開了命名空間
    cout << age << endl;			//但,此處沒用到上面的命名空間,而是用了局部變量
}

int main(){
    fun_01();
    getchar();
}

但如上的案例,不是我們推薦的使用方式,正確的如何:


#include <iostream>
using namespace std;

namespace alien {
    int age = 18;
}

namespace ware {
    int age = 28;
}

void fun_01(){
    using namespace alien;		# 通過using打開多個命名空間
    using namespace ware;

    cout << ware::age << endl;	#在不同的地方,使用不同命名空間的變量
}

int main(){
    fun_01();
    getchar();
}


3. namespace命名空間的使用

0.命名空間的定義:

https://blog.csdn.net/qq_40416052/article/details/82528676

  • 命名空間下,可以存放函數、變量、結果體、類等等
  • 命名空間,必須定義在全局作用域下面
  • 命名空間,可以嵌套定義命名空間
  • 命名空間是開放的,可以往命名空間裏面添加內容
  • 命名空間可以是無名的、匿名的
  • 命名空間,可以使用別名

1.命名空間的應用

當我們定義某個函數的時候,不同的場景需要實現的功能不一樣。那麼我們就可以把函數放在不同的命名空間裏面,這樣同一個函數名,我使用不同空間下面的函數,得到的結果就可以不一樣了。

在這裏插入圖片描述
在這裏插入圖片描述

// header_01.h, 定義了命名空間Alien,以及函數studying

namespace Alien {

	void studying();

}

// header_02.h, 定義了命名空間Alien02,以及函數studying

namespace Alien02 {

	void studying();

}
//func_01.cpp, 實現了Alien空間下的studying的功能

#include "header_01.h"
#include <iostream>
using namespace std;


void Alien::studying() {
	cout << "C語言的學習" << endl;
	int age = 18;
	cout << age << endl;
}

//func_02.cpp, 實現了Alien02空間下的studying的功能

#include "header_02.h"
#include <iostream>
using namespace std;


void Alien02::studying() {
	cout << "C++語言的學習" << endl;
	int age = 28;
	cout << age << endl;
}

// run.cpp文件,實現了最終調用的過程
#include <iostream>
#include "header_01.h"
#include "header_02.h"
using namespace std;


int main()
{
	cout << "run文件main函數-----start" << endl;
	Alien::studying();
	Alien02::studying();
	cout << "run文件main函數-----end" << endl;
	return 0;
}



//最終結果

run文件main函數-----start
C語言的學習
18
C++語言的學習
28
run文件main函數-----end

2.注意事項:

  • 最終調用的時候,如果引用2個頭文件,且這2個頭文件都有某個函數名的話,需要指明具體是哪個命名空間下的函數
#include <iostream>
#include "header_01.h"
#include "header_02.h"
using namespace std;


int main()
{
	cout << "run文件main函數-----start" << endl;
	studying();								//錯誤用法,因爲沒有指明具體是哪個命名空間下的studying函數
	cout << "run文件main函數-----end" << endl;
	return 0;
}

  • 只要使用cout函數,理論上當前文件就需要使用標準命名空間(std)以及引用輸入輸出頭文件(iostream),但是如果在引用的頭文件header_01.h或header_02.h裏面,如果已經使用標準命名空間(std)和輸入輸出頭文件,那麼當前文件(run.cpp)文件就不需要再使用了。-----也就是說,c++支持命名空間和頭文件的遞歸引用

  • 在func_01.cpp & func_02.cpp 中,需要指明命名空間下的函數,-----命名空間::函數名


void Alien02::studying() {
}

  • 如果不使用標準命名空間(std), 就不能直接使用cout函數,需要std::cout纔行,但這樣看起來比較臃腫

3.命名空間嵌套定義命名空間


#include <iostream>
using namespace std;

namespace Alien01 {

	int age = 18;

	namespace Alien02 {

		int age = 28;

	}

}



void main() {

	cout << Alien01::age << endl;
	cout << Alien01::Alien02::age << endl;		//多級命名空間嵌套調用

}

// 最終結果如下:

18
28

4.命名空間是開放的,可以往命名空間裏面添加內容


#include <iostream>
using namespace std;

namespace Alien {

	int age = 18;
}

namespace Alien {

	int height = 188;

}


void main() {

	cout << Alien::age << endl;
	cout << Alien::height << endl;


}

// 最終結果:

18
188

5.命名空間,可以是無名的、匿名的

如果是無名的、匿名的,那麼裏面的變量相當於靜態變量,只能在當前文件裏面使用,不能被其他文件調用,所以這個很少用,也不推去使用


#include <iostream>
using namespace std;

namespace  {

	int age = 18;
}



void main() {

	cout << age << endl;

}

6.命名空間可以起別名


#include <iostream>
using namespace std;

namespace veryLongName {

	int age = 18;
}



void main() {

	namespace v = veryLongName;

	cout << v::age << endl;

}

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