一、C++前言介紹
1.1 什么是C++?
?C語言是結(jié)構(gòu)化和模塊化的語言,適合處理較小規(guī)模的程序。對于復(fù)雜的問題,規(guī)模較大的程序,需要高度的抽象和建模時(shí),C語言則不合適。為了解決軟件危機(jī),20世紀(jì)80年代,計(jì)算機(jī)界提出了OOP(object oriented programming:面向?qū)ο?/strong>)思想,支持面向?qū)ο蟮某绦蛟O(shè)計(jì)語言應(yīng)運(yùn)而生。1982年,Bjarne Stroustrup博士在C語言的基礎(chǔ)上引入并擴(kuò)充了面向?qū)ο蟮母拍?,發(fā)明了一種新的程序語言。為了表達(dá)該語言與C語言的淵源關(guān)系,命名為C++。因此:C++是基于C語言而產(chǎn)生的,它既可以進(jìn)行C語言的過程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對象的程序設(shè)計(jì),還可以進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)。
1.2 C++的發(fā)展史
?1979年,貝爾實(shí)驗(yàn)室的本賈尼等人試圖分析unix內(nèi)核的時(shí)候,試圖將內(nèi)核模塊化,于是在C語言的基礎(chǔ)上進(jìn)行擴(kuò)展,增加了類的機(jī)制,完成了一個(gè)可以運(yùn)行的預(yù)處理程序,稱之為C with classes。
?語言的發(fā)展就像是練功打怪升級一樣,也是逐步遞進(jìn),由淺入深的過程。我們先來看下C++的歷史版本。
?C++還在不斷的向后發(fā)展。但是:現(xiàn)在社會(huì)上主流使用還是C++98和C++11,所有重點(diǎn)要把C++98和C++11掌握好,隨著對C++理解不斷加深,有時(shí)間可以去琢磨下更新的特性。
二、C++關(guān)鍵字
?C++一共有63個(gè)關(guān)鍵字,如下所示:
三、命名空間
3.1 為什么要有命名空間?
?大型程序一般會(huì)使用多個(gè)獨(dú)立開發(fā)的庫,這些庫又可能定義大量的全局變量的名字,如類、函數(shù)和模板等。當(dāng)程序用到多個(gè)供應(yīng)商提供的庫時(shí),不可避免地會(huì)發(fā)生某些名字相互沖突地情況。多個(gè)庫將名字放置在全局命名空間中將引發(fā)命名空間污染(namespace pollution)。
?為了解決上面的問題,于是提出了命名空間的概念,命名空間分割了全局命名空間,其中每一個(gè)命名空間是一個(gè)作用域。域是一種空間概念,常見的域有:局部域、全局域、類域、命名空間域,域會(huì)影響訪問和生命周期。
3.2 命名空間定義
?一個(gè)命名空間的定義包含兩部分:首先是關(guān)鍵字namespace
,隨后是命名空間的名字。在命名空間名字后面是一系列由花括號括起來的聲明和定義。只要是能出現(xiàn)在全局作用域中的聲明就能置于命名空間內(nèi),主要包括:類、變量(及其初始化操作)、函數(shù)(及其定義)、模板和其他命名空間(這意味著命名空間可以嵌套):
namespace wcy//命名空間的名字
{
//定義變量
int rand = 10;
//定義函數(shù)
int Add(int left, int right)
{
return left + right;
}
//定義類型
struct Node
{
struct Node* next;
int val;
};
//嵌套命名空間
namespace N2
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
?上面的代碼定義了一個(gè)名為wcy
的命名空間,該命名空間包含有變量、函數(shù)、類型、命名空間。和其他名字一樣,命名空間的名字也必須在定義它的作用域內(nèi)保持唯一,如果在同一個(gè)作用域中出現(xiàn)多個(gè)相同名字的命名空間,編譯器最后會(huì)把他們合并,這意味著命名空間可以是不連續(xù)的。命名空間既可以定義在全局作用域內(nèi),也可以定義在其他命名空間中,但是不能定義在函數(shù)或類的內(nèi)部。
小tips:
?命名空間作用域后面無須跟分號。
3.3 每一個(gè)命名空間都是一個(gè)作用域
?和其他作用域類似,命名空間中的每個(gè)名字都必須表示該命名空間內(nèi)的唯一實(shí)體。因?yàn)椴煌臻g的作用域不同,所以在不同命名空間內(nèi)可以有相同名字的成員。
?定義在某個(gè)命名空間中的名字可以被該命名空間內(nèi)的其他成員直接訪問,也可以被這些成員內(nèi)嵌作用域中的任何單位訪問。位于該命名空間之外的代碼則必須通過域作用限定符::
明確指出所用的名字屬于哪個(gè)命名空間。
namespace wcy
{
int a = 10;
}
int a = 30;
int main()
{
int a = 20;
printf("%d\n", a);
printf("%d\n", ::a);
printf("%d\n", wcy::a);
return 0;
}
?上面的代碼在局部域、全局域、wcy命名空間域中分別定義了一個(gè)a
變量并且賦了不同的值,在沒指定作用域的時(shí)候,會(huì)根據(jù)局部優(yōu)先的原則去訪問局部變量;::a
的左邊什么也沒有意味著去全局域中查找;wcy::a
則指定了要到wcy
這個(gè)域里面去查找。
3.4 命名空間的使用方法
命名空間有以下三種使用方法:
- 加命名空間名稱以及作用域限定符
int main()
{
printf("%d\n", wcy::a);
return 0;
}
- 使用using將命名空間中某個(gè)成員引入
using wcy::b;
int main()
{
printf("%d\n", wcy::a);
printf("%d\n", b);
return 0;
}
- 使用using namespace 命名空間名稱 引入
?可以用using namespace wcy
將命名空間展開,把命名空間中的成員提升到包含命名空間本身和using指示
最近的作用域。
namespace wcy
{
int a = 10;
int b = 5;
int c = 100;
}
int a = 30;
using namespace wcy;
int main()
{
printf("%d\n", a);//a不明確,出現(xiàn)二義性
printf("%d\n", ::a);//正確:訪問全局的a
printf("%d\n", wcy::a);//正確:訪問wcy中的a
printf("%d\n", b);//正確,去訪問wcy中的b
int c = 89;//當(dāng)前局部變量的c隱藏了wcy::c
c++;//當(dāng)前局部的c設(shè)置成90
return 0;
}
?以上面的代碼為例,通過using
把wcy
命名空間展開,這個(gè)過程相當(dāng)于把wcy
中的名字“添加”到全局作用域中,這使得程序可以直接訪問wcy
中的所有名字。
?當(dāng)命名空間被注入到它的外層作用域之后,很可能該命名空間中定義的名字會(huì)與其外層作用域中的成員沖突。例如在主函數(shù)中,wcy
的成員a
就與全局作用域中的a
產(chǎn)生了沖突。這種沖突是允許存在的,但是要想使用沖突的名字,我們就必須明確指出名字的版本。main
函數(shù)中所有未加限定的a
都會(huì)產(chǎn)生二義性錯(cuò)誤。
?為了使用像a
這樣的名字,我們必須使用作用域運(yùn)算符來明確指出所需的版本。我們使用::a
來表示全局作用域中的a
,而使用wcy::a
來表示定義在wcy
中的a
。
?因?yàn)閙ain的作用域和命名空間的作用域不同,所以main內(nèi)部的聲明可以隱藏命名空間中的某些成員的名字。例如,局部變量c
隱藏了命名空間的成員wcy::c
。在main中使用c
不存在二義性,他指的就是局部變量c。
3.5 嵌套的命名空間
?嵌套的命名空間同時(shí)是一個(gè)嵌套的作用域,它嵌套在外層命名空間的作用域中。嵌套的命名空間中的名字遵循的規(guī)則與往常類似:內(nèi)層命名空間聲明的名字將隱藏外層命名空間聲明的 同名成員。在嵌套的命名空間中定義的名字只在內(nèi)層命名空間中有效,外層命名空間的代碼想要訪問它必須在名字前添加限定符。
namespace wcy
{
int a = 10;
namespace wcy1
{
int a = 900;//將外層作用域的a隱藏了
int d = 1000;
}
//int b = d;//不正確:d是未聲明的標(biāo)識(shí)符
int b = wcy1::d;//正確訪問的是wcy1里面的d
namespace wcy2
{
int f = wcy1::d;//正確
}
}
int main()
{
printf("%d\n", wcy::wcy2::f);
printf("%d\n", wcy::wcy1::a);
printf("%d\n", wcy::a);
return 0;
}
3.6 C++標(biāo)準(zhǔn)庫的命名空間
?std
是C++標(biāo)準(zhǔn)庫的命名空間,C++將標(biāo)準(zhǔn)庫的定義實(shí)現(xiàn)都放到這個(gè)命名空間中。
std命名空間的使用慣例:
- 在日常練習(xí)中,建議直接用
using namespace std
即可,這樣很方便。 - 在項(xiàng)目開發(fā)中由于代碼較多、規(guī)模大,就很容易出現(xiàn)沖突問題,所以建議指定命名空間去訪問或者使用
using
把常用的名字引入。
四、C++輸入和輸出
#include<iostream>
// std是C++標(biāo)準(zhǔn)庫的命名空間名,C++將標(biāo)準(zhǔn)庫的定義實(shí)現(xiàn)都放到這個(gè)命名空間中
using namespace std;
int main()
{
cout << "Hello C++" << endl;
return 0;
}
代碼說明:
- 使用cout標(biāo)準(zhǔn)輸出對象(控制臺(tái))和cin標(biāo)準(zhǔn)輸入對象(鍵盤)時(shí),必須包含頭文件以及按命名空間使用方法使用std。
- cout和cin是全局的流對象,endl是特殊的C++符號,表示換行輸出,它們都包含在頭文件中。
-
<<
是流插入運(yùn)算符,>>
是流提取運(yùn)算符。 - 使用C++的輸入輸出更加方便,不需要像printf和scanf輸入輸出那樣,需要手動(dòng)控制格式。C++的輸入輸出可以自動(dòng)識(shí)別變量類型(本質(zhì)上是運(yùn)算符重載),但cout和cin的效率比較低。
- 實(shí)際上cout和cin分別是ostream和istream類型的對象,>>和<<也涉及運(yùn)算符重載等知識(shí),這些我將在后面逐一分享給大家。
注意:
?早期標(biāo)準(zhǔn)庫將所有功能在全局域中實(shí)現(xiàn),聲明在.h后綴的頭文件中,使用時(shí)只需要包含了對應(yīng)的頭文件即可,后來將其實(shí)現(xiàn)在std
命名空間下,為了和C的頭文件區(qū)分,也為了正確使用命名空間,規(guī)定C++的頭文件不帶.h。有一些舊編譯器中還支持<iostream.h>格式,現(xiàn)在一些新的編譯器已不再支持,因此推薦使用<iostream>配合std的方式。文章來源:http://www.zghlxwxcb.cn/news/detail-516667.html
?今天的分享到這里就結(jié)束啦!如果覺得文章還不錯(cuò)的話,可以三連支持一下,您的支持就是春人前進(jìn)的動(dòng)力!文章來源地址http://www.zghlxwxcb.cn/news/detail-516667.html
到了這里,關(guān)于【C++初階】C++入門——C++介紹、命名空間、輸入輸出的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!