国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例

這篇具有很好參考價(jià)值的文章主要介紹了【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace


??前言

C++是在C的基礎(chǔ)之上,容納進(jìn)去了面向?qū)ο缶幊趟枷?,并增加了許多有用的庫(kù),以及編程范式
等。熟悉C語(yǔ)言之后,對(duì)C++學(xué)習(xí)有一定的幫助,本章節(jié)主要目標(biāo):

  1. 補(bǔ)充C語(yǔ)言語(yǔ)法的不足,以及C++是如何對(duì)C語(yǔ)言設(shè)計(jì)不合理的地方進(jìn)行優(yōu)化的,比如:作用
    域方面、IO方面、函數(shù)方面、指針?lè)矫?、宏方面等?/li>
  2. 為后續(xù)類和對(duì)象學(xué)習(xí)打基礎(chǔ)。

?? C++關(guān)鍵字(C++98)

C++總計(jì)63個(gè)關(guān)鍵字,C語(yǔ)言32個(gè)關(guān)鍵字
ps:下面我們只是看一下C++有多少關(guān)鍵字,不對(duì)關(guān)鍵字進(jìn)行具體的講解。后面我們學(xué)到以后再
細(xì)講。
語(yǔ)言的發(fā)展就像是練功打怪升級(jí)一樣,也是逐步遞進(jìn),由淺入深的過(guò)程。我們先來(lái)看下C++的歷史版本。

asm do if return try continue
auto double inline short typedef for
bool dynamic_cast int signed typeid public
break else long sizeof typename throw
case enum mutable static union wchar_t
catch explicit namespace static_cast unsigned default
char export new struct using friend
class extern operator switch virtual register
const false private template void true
const_cast float protected this volatile while
delete goto reinterpret_cast

?? 命名空間

C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用域中,可能會(huì)導(dǎo)致很多沖突。使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對(duì)這種問(wèn)題的。
【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

??命名空間定義

定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可,{}
中即為命名空間的成員。

 1. 正確的命名空間定義
//正確的命名空間定義
namespace Asen
{
	//命名空空間中可以定義變量/函數(shù)/類型
	int rand = 10;
	
	int Add(int begin, int end)
	{
		return begin + end;
	}

	struct Node
	{
		struct Node* next;
		int data;
	};
}
  1. 命名空間可以嵌套
namespace Asen
{
	int a;
	int b;
	
	int Add(int left, int right)
	{
		return left + right;
	}

	namespace needs_confidence
	{
		int Sub(int begin, int end)
		{
			return begin - end;
		}
	}
}
  1. 同一個(gè)工程中允許存在多個(gè)相同名稱的命名空間,編譯器最后會(huì)合成同一個(gè)命名空間中。
    如:一個(gè)工程中的test.h和上面test.cpp中兩個(gè)asen會(huì)被合并成一個(gè)
    【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

注意:一個(gè)命名空間就定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中

??命名空間使用

命名空間中成員該如何使用呢?比如以下代碼運(yùn)行:

namespace Asen
{
	int a = 0;
	int b = 1;
	
	int Add(int left, int right)
	{
		return left + right;
	}

	namespace needs_confidence
	{
		int Sub(int begin, int end)
		{
			return begin - end;
		}
	}
}


int main()
{
	printf("%d\n", a);
	return 0;
}

運(yùn)行截圖:
【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

??命名空間的使用有三種方式:

??加命名空間名稱及作用域限定符

int main()
{
	printf("%d\n", Asen::a);
	return 0;
}

【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

??使用using將命名空間中某個(gè)成員引入

using Asen::b;
int main()
{
	printf("%d\n", Asen::a);
	printf("%d\n", b);
	return 0;
}

【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

?? 使用using namespace 命名空間名稱 引入

using namespace Asen;
int main()
{
	printf("%d\n", Asen::a);
	printf("%d\n", b);
	Add(66, 88);
	return 0;
}

【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

??命名空間的查找先后順序

一. 命名空間的查找順序是:

當(dāng)前命名空間 > 父命名空間 > 全局命名空間 > 模塊命名空間 > 內(nèi)置模塊命名空間

從最具體的當(dāng)前命名空間開(kāi)始向上級(jí)別進(jìn)行查找,一直到全局和內(nèi)置模塊命名空間,以此來(lái)解決可能出現(xiàn)的同名變量和函數(shù)的命名沖突問(wèn)題。

具體規(guī)則如下:

  1. 當(dāng)前命名空間
    首先在當(dāng)前命名空間中查找。
  2. 父命名空間
    如果當(dāng)前命名空間沒(méi)有找到,則查找其直接父命名空間。
  3. 嵌套的父命名空間
    如果直接父命名空間也沒(méi)有找到,則繼續(xù)向上查找更高層次的父命名空間。
  4. 全局命名空間
    如果所有父命名空間都沒(méi)有找到,則最后在全局命名空間中查找。
  5. 導(dǎo)入的命名空間
    如果使用了using指令導(dǎo)入其他命名空間,也會(huì)在導(dǎo)入的命名空間中查找。

舉個(gè)例子:

namespace A 
{
  void func() 
  {
    // do something 
  }
}

namespace B 
{
	  namespace C 
 	 {
  	 	 void func() 
  	 	 {
    	 	 // do something
   		 } 
 	 }

 	 using namespace A;

	  void test() 
 	 {
   		 func(); // 會(huì)調(diào)用B::C::func()
  	 }
}

這里B命名空間中的test函數(shù),首先在B命名空間中查找func,沒(méi)有找到,然后去B的子命名空間C中查找,找到就調(diào)用C中的func。

簡(jiǎn)單總結(jié)
編譯默認(rèn)查找
a、當(dāng)前局部域 : 自留地
b、全局域找 : 村子野地
c、到展開(kāi)的命名空間中查找 : 相當(dāng)于張大爺在自己的自留地加了聲明,誰(shuí)需要就來(lái)摘

二. 以下是有關(guān)命名空間的查找使用實(shí)例:

namespace Asen
{
	namespace needs_confi
	{
		int rand = 0;
		 
		int Add(int left, int right)
		{
			return left + right;
		}

		struct Node
		{
			struct Node* next;
			int data;
		};
	}
}

namespace needs_confi
{
	int rand = 0;

	int Add(int left, int right)
	{
		return (left + right) * 10;
	}
}

int main()
{
	printf("%p\n", rand);
	printf("%d\n", Asen::needs_confi::rand);

	printf("hello world\n");

	printf("%d\n", Asen::needs_confi::Add(2, 3));
	printf("%d\n", needs_confi::Add(2, 3));

	struct Asen::needs_confi::Node pnode;
}

【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

三· 展開(kāi)命名空間暴露問(wèn)題:
展開(kāi)命名空間可能會(huì)導(dǎo)致的主要問(wèn)題如下:

  1. 名稱沖突
    當(dāng)使用using namespace將一個(gè)命名空間中的所有名稱導(dǎo)入到當(dāng)前作用域時(shí),如果導(dǎo)入的命名空間和當(dāng)前命名空間存在同名的變量/函數(shù)等,就會(huì)產(chǎn)生名稱沖突,編譯或運(yùn)行時(shí)可能會(huì)出現(xiàn)錯(cuò)誤。
  2. 污染全局作用域
    使用using namespace后,導(dǎo)入的所有名稱都會(huì)暴露到全局作用域,可能會(huì)與其他代碼產(chǎn)生沖突,也更難追蹤是哪個(gè)命名空間中的名稱。
  3. 難以區(qū)分來(lái)源
    如果直接使用using namespace,在代碼中看到一個(gè)名稱就不知道它來(lái)自哪個(gè)具體的命名空間。這給代碼維護(hù)和調(diào)試帶來(lái)困難。
  4. 性能影響
    使用using namespace后,編譯器需要在更廣泛的作用域中查找名稱,這可能會(huì)影響編譯效率和程序性能。
  5. 依賴隱藏
    使用using namespace可能會(huì)隱藏某些依賴關(guān)系,例如標(biāo)準(zhǔn)庫(kù)名稱可能會(huì)屏蔽用戶自定義的同名名稱。
  6. 難以控制
    直接使用using namespace沒(méi)有辦法精細(xì)控制導(dǎo)入的范圍,無(wú)法選擇性導(dǎo)入某些名稱。

因此一般來(lái)說(shuō),不推薦在頭文件中使用using namespace,在源文件中使用也應(yīng)謹(jǐn)慎。建議直接使用具體的命名空間限定名稱。

如:這里我包含了兩個(gè)頭文件,其中這個(gè)#include"Stack.h"的內(nèi)容如下,這里主要是用namespace 空間定義,然后展開(kāi)namespace ,目的是為了看兩個(gè)命名空間都有相同的內(nèi)容,在查找時(shí)看看會(huì)先用哪個(gè)?還是會(huì)編譯報(bào)錯(cuò):
【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

#include"Queue.h"
#include"Stack.h"

namespace xjh
{
	typedef struct Stack
	{
	}ST;

	void STInit(ST* ps)
	{}


	struct Queue
	{
		//...
	};
}

// 展開(kāi)命名空間 
using namespace ahui;
using namespace xjh;

// 編譯默認(rèn)查找
// a、當(dāng)前局部域				: 自留地
// b、全局域找				: 村子野地
// c、到展開(kāi)的命名空間中查找  : 相當(dāng)于張大爺在自己的自留地加了聲明,誰(shuí)需要就來(lái)摘

int main()
{
	struct Stack st1;
	STInit(&st1);
	printf("%d\n", sizeof(st1));

	ahui::ST st;
	printf("%d\n", sizeof(st));

	STInit(&st);
	STPush(&st, 1);
	STPush(&st, 2);
	STPush(&st, 3);
	STPush(&st, 4);

	return 0;
}

代碼運(yùn)行:

【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

?? C++輸入&輸出

和我們剛學(xué)C語(yǔ)言時(shí),學(xué)習(xí)了printf和scanf來(lái)進(jìn)行輸出和輸入,C++同樣也有輸入和輸出,我們來(lái)看下C++是如何來(lái)實(shí)現(xiàn)問(wèn)候的。

#include<iostream>
// std是C++標(biāo)準(zhǔn)庫(kù)的命名空間名,C++將標(biāo)準(zhǔn)庫(kù)的定義實(shí)現(xiàn)都放到這個(gè)命名空間中
using namespace std;
int main()
{
	cout<<"Hello world!!!"<<endl;
	return 0;
}

運(yùn)行圖:
【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace
說(shuō)明:

  1. 使用cout標(biāo)準(zhǔn)輸出對(duì)象(控制臺(tái))cin標(biāo)準(zhǔn)輸入對(duì)象(鍵盤)時(shí),必須包含< iostream >頭文件
    以及按命名空間使用方法使用std。
  2. cout和cin是全局的流對(duì)象,endl是特殊的C++符號(hào),表示換行輸出,他們都包含在包含<
    iostream >頭文件中。
  3. <<是流插入運(yùn)算符,>>是流提取運(yùn)算符。
  4. 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣,需要手動(dòng)控制格式。
    C++的輸入輸出可以自動(dòng)識(shí)別變量類型。
  5. 實(shí)際上coutcin分別是ostreamistream類型的對(duì)象,>><<也涉及運(yùn)算符重載等知識(shí),
    這些知識(shí)我們我們后續(xù)才會(huì)學(xué)習(xí),所以我們這里只是簡(jiǎn)單學(xué)習(xí)他們的使用。后面我們還有有
    一個(gè)章節(jié)更深入的學(xué)習(xí)IO流用法及原理。
    注意:早期標(biāo)準(zhǔn)庫(kù)將所有功能在全局域中實(shí)現(xiàn),聲明在.h后綴的頭文件中,使用時(shí)只需包含對(duì)應(yīng)
    頭文件即可,后來(lái)將其實(shí)現(xiàn)在std命名空間下,為了和C頭文件區(qū)分,也為了正確使用命名空間,
    規(guī)定C++頭文件不帶.h;舊編譯器(vc 6.0)中還支持<iostream.h>格式,后續(xù)編譯器已不支持,因
    此**推薦使用<iostream>+std**的方式。

注意:早期標(biāo)準(zhǔn)庫(kù)將所有功能在全局域中實(shí)現(xiàn),聲明在.h后綴的頭文件中,使用時(shí)只需包含對(duì)應(yīng)
頭文件即可,后來(lái)將其實(shí)現(xiàn)在std命名空間下,為了和C頭文件區(qū)分,也為了正確使用命名空間,
規(guī)定C++頭文件不帶.h;舊編譯器(vc 6.0)中還支持<iostream.h>格式,后續(xù)編譯器已不支持,因
此推薦使用+std的方式。

#include <iostream>
using namespace std;
int main()
{
   int a;
   double b;
   char c;
     
   // 可以自動(dòng)識(shí)別變量的類型
   cin>>a;
   cin>>b>>c;
     
   cout<<a<<endl;
   cout<<b<<" "<<c<<endl;
   return 0;
}

【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace>注意:關(guān)于coutcin還有很多更復(fù)雜的用法,比如控制浮點(diǎn)數(shù)輸出精度,控制整形輸出進(jìn)制格式等
等。因?yàn)镃++兼容C語(yǔ)言的用法,這些又用得不是很多,我們這里就不展開(kāi)學(xué)習(xí)了。后續(xù)如果有需要,我
們?cè)賹W(xué)習(xí)。

??std命名空間的使用慣例

stdC++標(biāo)準(zhǔn)庫(kù)的命名空間,如何展開(kāi)std使用更合理呢?

  1. 在日常練習(xí)中,建議直接using namespace std即可,這樣就很方便。
  2. using namespace std展開(kāi),標(biāo)準(zhǔn)庫(kù)就全部暴露出來(lái)了,如果我們定義跟庫(kù)重名的類型/對(duì)
    象/函數(shù),就存在沖突問(wèn)題。該問(wèn)題在日常練習(xí)中很少出現(xiàn),但是項(xiàng)目開(kāi)發(fā)中代碼較多、規(guī)模
    大,就很容易出現(xiàn)。所以建議在項(xiàng)目開(kāi)發(fā)中使用,像std::cout這樣使用時(shí)指定命名空間 +
    using std::cout展開(kāi)常用的庫(kù)對(duì)象/類型等方式
    。
    【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace

??總結(jié)

感謝你的收看,如果文章有錯(cuò)誤,可以指出,我不勝感激,讓我們一起學(xué)習(xí)交流,如果文章可以給你一個(gè)小小幫助,感謝?? ?? ?? ??,喜歡的話可以點(diǎn)個(gè)關(guān)注,也可以給博主點(diǎn)一個(gè)小小的贊??呀
【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例,【C++的奇跡之旅】,c++,java,開(kāi)發(fā)語(yǔ)言,運(yùn)算符優(yōu)先級(jí),命名空間namespace文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-844892.html

到了這里,關(guān)于【C++的奇跡之旅(二)】C++關(guān)鍵字&&命名空間使用的三種方式&&C++輸入&輸出&&命名空間std的使用慣例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包