最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你初識C++和命名空間

 更新時間:2024年10月15日 09:19:03   作者:埋頭編程~  
C++是在C語言基礎(chǔ)上發(fā)展的面向?qū)ο笳Z言,C++支持過程化、面向?qū)ο蠹俺橄髷?shù)據(jù)類型的程序設(shè)計,C++的發(fā)展包括多個版本,下面這篇文章主要介紹了一文帶你初識C++和命名空間的相關(guān)資料,需要的朋友可以參考下

1. 初識C++

C語言是結(jié)構(gòu)化和模塊化的語言,適合處理較小規(guī)模的程序。對于復(fù)雜的問題,規(guī)模較大的程序,需要高度的抽象和建模時,C語言則不合適。為了解決軟件危機, 20世紀80年代, 計算機界提出了OOP(objectoriented programming:面向?qū)ο?思想,支持面向?qū)ο蟮某绦蛟O(shè)計語言應(yīng)運而生。所以我們經(jīng)常說到C++是面向?qū)ο蟮恼Z言,而C語言是面向過程的語言。

1982年,Bjarne Stroustrup博士在C語言的基礎(chǔ)上引入并擴充了面向?qū)ο蟮母拍?,發(fā)明了一種新的程序語言。為了表達該語言與C語言的淵源關(guān)系,命名為C++。因此:C++是基于C語言而產(chǎn)生的,它既可以進行C語言的過程化程序設(shè)計,又可以進行以抽象數(shù)據(jù)類型為特點的基于對象的程序設(shè)計,還可以進行面向?qū)ο蟮某绦蛟O(shè)計。

請大家記住C++誕生的時間(1982年)以及發(fā)明C++的大佬 —— “本賈尼”!

2. C++的發(fā)展階段

作為了解就好,但是也要知道我們現(xiàn)在是在用C++版本是多少。

階段內(nèi)容
C with classes類及派生類、公有和私有成員、類的構(gòu)造和析構(gòu)、友元、內(nèi)聯(lián)函數(shù)、賦值運算符重載等
C++1.0添加虛函數(shù)概念,函數(shù)和運算符重載,引用、常量等
C++2.0更加完善支持面向?qū)ο?,新增保護成員、多重繼承、對象的初始化、抽象類、靜態(tài)成員以及const成員函數(shù)
C++3.0進一步完善,引入模板,解決多重繼承產(chǎn)生的二義性問題和相應(yīng)構(gòu)造和析構(gòu)的處理
C++98C++標準第一個版本,絕大多數(shù)編譯器都支持,得到了國際標準化組織(ISO)和美國標準化協(xié)會認可,以模板方式重寫C++標準庫,引入了STL(標準模板庫)
C++03C++標準第二個版本,語言特性無大改變,主要:修訂錯誤、減少多異性
C++05C++標準委員會發(fā)布了一份計數(shù)報告(Technical Report,TR1),正式更名C++0x,即:計劃在本世紀第一個10年的某個時間發(fā)布
C++11增加了許多特性,使得C++更像一種新語言,比如:正則表達式、基于范圍for循環(huán)、auto關(guān)鍵字、新容器、列表初始化、標準線程庫等
C++14對C++11的擴展,主要是修復(fù)C++11中漏洞以及改進,比如:泛型的lambda表達式,auto的返回值類型推導(dǎo),二進制字面常量等
C++17在C++11上做了一些小幅改進,增加了19個新特性,比如:static_assert()的文本信息可選,F(xiàn)old表達式用于可變的模板,if和switch語句中的初始化器等
C++20自C++11以來最大的發(fā)行版,引入了許多新的特性,比如:模塊(Modules)、協(xié)程(Coroutines)、范圍(Ranges)、概念(Constraints)等重大特性,還有對已有特性的更新:比如Lambda支持模板、范圍for支持初始化等
C++23明確的對象參數(shù)(Deducing this)、if consteval、多維下標運算符、內(nèi)建衰減復(fù)制支持、標記不可達代碼(std::unreachable)、平臺無關(guān)的假設(shè)([[assume]])、命名通用字符轉(zhuǎn)義、擴展基于范圍的 for 循環(huán)中臨時變量的生命周期、constexpr 增強、簡化的隱式移動、靜態(tài)運算符 static operator[] 以及類模板參數(shù)推導(dǎo)

C++還在不斷地向后發(fā)展。但是現(xiàn)在公司主流的是用的還是C++98和C++11,等大家以后工作時可以慢慢鉆研C++的新特性,現(xiàn)在這需要我們熟練的掌握C++98和C++11這兩個標準即可。

我們現(xiàn)在學習階段大都接觸到的也就是這兩種標準(C++11和C++98)。

2. 命名空間

2.1 為什么要有命名空間?

請大家看一下下面的代碼:

#include<stdio.h>

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

上面的代碼會不會報錯?相信掌握C語言語法的讀者就會說,上面的代碼是可以正常編譯通過的。沒錯,上面的代碼的確是沒有任何問題的。

那如果我將上述的代碼做了一點改變,代碼還能正常編譯過去嗎?

#include<stdio.h>
#include<stdlib.h>
int rand = 0;
int main()
{
	int rand = 10;
	printf("%d\n",rand);
	return 0;
}

如果你們自己去測試的話,顯然會出現(xiàn)編譯錯誤。

這是什么原因呢?
編譯器說rand重定義,而且錯誤是我們在引用stdlib.h的頭文件之后才出現(xiàn)的。到這里我們就意識到了有個rand的變量名或者時函數(shù)名,而我們知道一個.c/.cpp的源文件在編譯階段的預(yù)處理階段會把頭文件的內(nèi)容給展開,所以就會出現(xiàn)rand重定義了。

這個問題在C語言上只能是要你改變這個變量名了。C++就能夠解決這個問題,即使你不更改變量名,編譯器也不會報錯,這個C++的利器就是命名空間

為了讓大家對命名空間的這個新事物引起更高的重視,我來給大家舉個生活中實際例子:

比如現(xiàn)在有一個互聯(lián)網(wǎng)公司,這個公司最近準備研發(fā)一個項目,老板就把項目就分配給了一個小組,而小組里面有兩人小明和小剛負責分別負責這個項目的兩個模塊。他們兩個寫啊寫啊,終于有一天他們倆將各自寫的項目都提交了上去,編譯一下卻出現(xiàn)錯誤,經(jīng)過檢查發(fā)現(xiàn)他們兩個項目的變量名有很多是重疊了,這個會出現(xiàn)命名沖突的問題。如果他們是用C語言來寫的話,那必定有一方得是改變變量命名,那兩個人肯定都不愿意改的。如果用C++的命名空間的話,就可以完美避開這個問題了。

好了,在講完命名空間的重要性之后,我們就得認識一下命名空間的用法以及底層的原理!

2.2 命名空間的語法

namespace 命名空間名
{
	內(nèi)容
}

下面我來一遍做展示,一遍拓展:

  • 這個是我們進行正常的命名空間定義:
namespace test
{
	int rand = 10;
	int Add(int x, int y)
	{
		return x+y;
	}

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

??我們不僅可以在命名空間定義并初始化變量,還可以進行對函數(shù)的定義,結(jié)構(gòu)體的定義等。

  • 命名空間可以嵌套:
namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
 	{
     	return left + right;
 	}
	namespace N2
 	{
     	int c;
     	int d;
     	int Sub(int left, int right)
     	{
     	    return left - right;
     	}
 	}
}

??可以看到我們中命名空間去嵌套另一個命名空間。

  • 同一個工程中允許不同的文件出現(xiàn)名稱相同的命名空間,但是最后編譯器會將不同文件相同名稱的命名空間給合并到一起:
//這個是test.h文件里面的命名空間
namespace N1
{
	int Mul(int left, int right)
 	{
    	 return left * right;
	}
}

//這個是test.cpp文件里面的命名空間
namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
	 {
	     return left + right;
	 }
	namespace N2
	{
	     int c;
 	     int d;
	     int Sub(int left, int right)
     	{
         	return left - right;
     	}
 	}
}

經(jīng)過編譯器的編譯之后,最后的合并的結(jié)果就是:

namespace N1
{
	int Mul(int left, int right)
 	{
    	 return left * right;
	}
	int a;
	int b;
	int Add(int left, int right)
	 {
	     return left + right;
	 }
	namespace N2
	{
	     int c;
 	     int d;
	     int Sub(int left, int right)
     	{
         	return left - right;
     	}
 	}
}

2.3 命名空間的原理

提到命名空間,我們就不得不提另一個概念"域"。

想必大家或多或少都會在C語言中聽過"作用域"(全局域、局部域)這個名詞。這個就是"域"中的一種,在C++中還有命名空間域、類域等等。而我們現(xiàn)在說講的命名空間,它的實質(zhì)就是一種命名空間域。

那可能有的讀者會問,"域"是個什么東西?
那我們可以先從我們熟悉的入手,全局域和局部域。我們都知道在給全局變量和局部變量去相同的變量名時,程序是不會報錯的,這個就是"域"的作用。我們可以把"域"想象成一面墻,被這面的墻隔開的事物互不干擾,你干你的事,我剛我的事。
講到這里,我相信你已經(jīng)對命名空間域已經(jīng)有感覺了。我們也可以把命名空間域看作是一面墻,將局部域與全局域給隔開了。在這個域里面有自己獨自維護的變量。

??所以我們可以總結(jié)一下:命名空間是解決全局變量與頭文件的命名沖突問題,或者是解決同一個工程項目中不同模塊之間的命名沖突問題。

2.4 使用命名空間的三種方式

我們講解了命名空間的原理,那命名空間里面的成員我們該怎么引用呢?比如:

namespace test
{
 	// 命名空間中可以定義變量/函數(shù)/類型
 	int a = 0;
	 int b = 1;
 	int Add(int left, int right)
 	{
 		return left + right;
 	}
 	struct Node
 	{
 		struct Node* next;
 		int val;
 	};
}

int main()
{
 	// 編譯報錯:error C2065: “a”: 未聲明的標識符
 	printf("%d\n", a);
	return 0;
}

2.4.1 加命名空間名稱及作用域限定符( :: )

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

2.4.2 使用using關(guān)鍵字將命名空間中某個成員 引入

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

這種方式建議使用!??!

2.4.3 使用using namespace 命名空間名 引入

using  namespace test;
int main()
{
 	printf("%d\n", test::a);
 	printf("%d\n", b);
 	Add(10,20);
	return 0;
}

??注意:使用這個方法時是有風險的(這個命名空間里面有著和全局變量一樣的變量名),所以我們在平時進行練習或比賽的時候使用即可。

3. 簡單了解C++的輸入和輸出

我們再學一門新的語言時,往往會都會干一件事,就是在屏幕上輸出"Hello World"。

所以這里我們就簡單認識一下C++的輸入和輸出。

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

說明:
1. 使用cout標準輸出對象(控制臺)和cin標準輸入對象(鍵盤)時,必須包含< iostream >頭文件以及按命名空間使用方法使用std。
2. cout和cin是全局的流對象,endl是特殊的C++符號,表示換行輸出,他們都包含在包含< iostream >頭文件中。
3. <<是流插入運算符,>>是流提取運算符。
4. 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時那樣,需要手動控制格式。
C++的輸入輸出可以自動識別變量類型。
5. 實際上cout和cin分別是ostream和istream類型的對象,>>和<<也涉及運算符重載等知識,這些知識我們我們后續(xù)才會學習,所以我們這里只是簡單學習他們的使用。

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

#include <iostream>
using namespace std;
int main()
{
   int a = 10;
   double b = 3.1415;
   char c = 'l';
     
   // 可以自動識別變量的類型
   cin>>a;
   cin>>b>>c;
     
   cout<<a<<endl;
   cout<<b<<" "<<c<<endl;
   return 0;
}

??最后在聲明一點,std命名空間的使用慣例:
std是C++標準庫的命名空間,如何展開std使用更合理呢?

在日常練習中,建議直接using namespace std即可,這樣就很方便。

using namespace std展開,標準庫就全部暴露出來了,如果我們定義跟庫重名的類型/對象/函數(shù),就存在沖突問題。該問題在日常練習中很少出現(xiàn),但是項目開發(fā)中代碼較多、規(guī)模大,就很容易出現(xiàn)。所以建議在項目開發(fā)中使用,像std::cout這樣使用時指定命名空間 + using std::cout展開常用的庫對象/類型等方式。

總結(jié) 

到此這篇關(guān)于C++和命名空間的文章就介紹到這了,更多相關(guān)C++和命名空間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt自定義控件實現(xiàn)圓盤進度條

    Qt自定義控件實現(xiàn)圓盤進度條

    這篇文章主要為大家詳細介紹了Qt自定義控件實現(xiàn)圓盤進度條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 總結(jié)C/C++面試中可能會碰到的字符串指針題

    總結(jié)C/C++面試中可能會碰到的字符串指針題

    C/C++是最能體現(xiàn)程序員能力的語言之一,其功能強大,在IT行業(yè)的各個方面都有大量的應(yīng)用。下面這篇文章主要介紹了總結(jié)了在C/C++面試中可能會碰到的字符串指針題,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • C語言中的強符號和弱符號介紹

    C語言中的強符號和弱符號介紹

    這篇文章主要介紹了C語言中的強符號和弱符號介紹,本文用多個實例來講解強符號和弱符號,需要的朋友可以參考下
    2015-03-03
  • C++ atoi()函數(shù)用法案例詳解

    C++ atoi()函數(shù)用法案例詳解

    這篇文章主要介紹了C++ atoi()函數(shù)用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 關(guān)于C++虛函數(shù)與靜態(tài)、動態(tài)綁定的問題

    關(guān)于C++虛函數(shù)與靜態(tài)、動態(tài)綁定的問題

    這篇文章主要介紹了C++虛函數(shù)與靜態(tài)、動態(tài)綁定,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • C語言中數(shù)據(jù)在內(nèi)存如何存儲

    C語言中數(shù)據(jù)在內(nèi)存如何存儲

    本文詳細講解了C語言中數(shù)據(jù)在內(nèi)存如何存儲,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • 下標操作符重載模擬多維數(shù)組詳解

    下標操作符重載模擬多維數(shù)組詳解

    雖然不能直接實現(xiàn)一對下標操作符重載,但是我們可以間接模擬。思路是這樣的,先通過單下標操作返回一個具有下標操作能力的左值,對左值進行下標操作,兩個下標操作表達式聯(lián)立就實現(xiàn)了雙下標操作
    2013-09-09
  • C語言超詳細講解結(jié)構(gòu)體與聯(lián)合體的使用

    C語言超詳細講解結(jié)構(gòu)體與聯(lián)合體的使用

    結(jié)構(gòu)體和聯(lián)合體用于描述事物的屬性,如一只鳥的信息,可能包括它的品種,體重,顏色,年齡等,接下來大家一起來詳細看看吧
    2022-05-05
  • C語言實現(xiàn)學生打卡系統(tǒng)

    C語言實現(xiàn)學生打卡系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學生打卡系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++基于QWidget和QLabel實現(xiàn)圖片縮放,拉伸與拖拽

    C++基于QWidget和QLabel實現(xiàn)圖片縮放,拉伸與拖拽

    這篇文章主要為大家詳細介紹了C++如何基于QWidget和QLabel實現(xiàn)圖片縮放、拉伸與拖拽等功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02

最新評論

望江县| 邹城市| 黄浦区| 宁强县| 皮山县| 罗田县| 兰坪| 湖南省| 井陉县| 漠河县| 遂溪县| 汉中市| 新乐市| 台安县| 化德县| 喀喇沁旗| 汾阳市| 如皋市| 赣榆县| 平陆县| 宝清县| 昌平区| 天津市| 大荔县| 蒙阴县| 临朐县| 阜新市| 蓬溪县| 南昌县| 松桃| 邵阳县| 依兰县| 广河县| 双城市| 百色市| 东丰县| 宁明县| 科尔| 天门市| 萨迦县| 凌源市|