??博客主頁: 小羊失眠啦.
??系列專欄:《C語言》 《數(shù)據(jù)結(jié)構(gòu)》 《Linux》《Cpolar》
??感謝大家點(diǎn)贊??收藏?評論??
一、C++的認(rèn)識
1.1 什么是C++
C語言是結(jié)構(gòu)化和模塊化的語言,適合處理較小規(guī)模的程序
。對于復(fù)雜的問題,規(guī)模較大的程序,需要高度的抽象和建模時(shí),C語言則不合適。為了解決軟件危機(jī), 20世紀(jì)80年代, 計(jì)算機(jī)界提出了OOP(object oriented programming:面向?qū)ο?/code>)思想,支持面向?qū)ο蟮某绦蛟O(shè)計(jì)語言應(yīng)運(yùn)而生。 1982年,Bjarne Stroustrup博士在C語言的基礎(chǔ)上引入并擴(kuò)充了面向?qū)ο蟮母拍睿l(fā)明了一 種新的程序語言。命名為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。
C++的歷史版本:
階段 | 內(nèi)容 |
---|---|
C with classes | 類及派生類、公有和私有成員、類的構(gòu)造和析構(gòu)、友元、內(nèi)聯(lián)函數(shù)、賦值運(yùn)算符 重載等 |
C++ 1.0 | 添加虛函數(shù)概念,函數(shù)和運(yùn)算符重載,引用、常量等 |
C++ 2.0 | 更加完善支持面向?qū)ο螅略霰Wo(hù)成員、多重繼承、對象的初始化、抽象類、靜 態(tài)成員以及const成員函數(shù) |
C++ 3.0 | 進(jìn)一步完善,引入模板,解決多重繼承產(chǎn)生的二義性問題和相應(yīng)構(gòu)造和析構(gòu)的處 理 |
C++98 |
C++標(biāo)準(zhǔn)第一個(gè)版本,絕大多數(shù)編譯器都支持,得到了國際標(biāo)準(zhǔn)化組織(ISO)和美 國標(biāo)準(zhǔn)化協(xié)會認(rèn)可,以模板方式重寫C++標(biāo)準(zhǔn)庫,引入了STL(標(biāo)準(zhǔn)模板庫) |
C++03 | C++標(biāo)準(zhǔn)第二個(gè)版本,語言特性無大改變,主要:修訂錯(cuò)誤、減少多異性 |
C++05 | C++標(biāo)準(zhǔn)委員會發(fā)布了一份計(jì)數(shù)報(bào)告(Technical Report,TR1),正式更名 C++0x,即:計(jì)劃在本世紀(jì)第一個(gè)10年的某個(gè)時(shí)間發(fā)布 |
C++11 | 增加了許多特性,使得C++更像一種新語言,比如:正則表達(dá)式、基于范圍for循 環(huán)、auto關(guān)鍵字、新容器、列表初始化、標(biāo)準(zhǔn)線程庫等 |
C++14 | 對C++11的擴(kuò)展,主要是修復(fù)C++11中漏洞以及改進(jìn),比如:泛型的lambda表 達(dá)式,auto的返回值類型推導(dǎo),二進(jìn)制字面常量等 |
C++17 | 在C++11上做了一些小幅改進(jìn),增加了19個(gè)新特性,比如:static_assert()的文 本信息可選,F(xiàn)old表達(dá)式用于可變的模板,if和switch語句中的初始化器等 |
C++20 |
自C++11以來最大的發(fā)行版,引入了許多新的特性,比如:**模塊(Modules)、協(xié)程(Coroutines)、范圍(Ranges)、概念(Constraints)**等重大特性,還有對已有 特性的更新:比如Lambda支持模板、范圍for支持初始化等 |
C++23 | 制定ing |
二、C++關(guān)鍵字
C++一共有63個(gè)關(guān)鍵字,其中有32個(gè)是C語言中的關(guān)鍵字
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 |
三、命名空間
3.1 為什么有命名空間
在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用域中,可能會導(dǎo)致很多沖突。使用命名空間的目的是對標(biāo)識符的名稱進(jìn)行本地化, 以避免命名沖突或名字污染。
例如:
#include<stdio.h> #include<stdlib.h> int rand = 10; int main() { printf("%d", rand); return 0; }
在這段程序中,不引用頭文件
#include <stdlib.h>
是可以正常運(yùn)行的,但引用后程序就會報(bào)錯(cuò),這是什么原因呢?因?yàn)?rand
在<stdlib.h>
中已有了定義,這里報(bào)了重定義的錯(cuò)誤。
命名空間分割了全局命名空間,其中每一個(gè)命名空間是一個(gè)作用域。域是一種空間概念,常見的域有:局部域、全局域、類域、命名空間域,域會影響訪問和生命周期。
3.2 命名空間的定義
命名空間的定義由兩部分構(gòu)成:首先是關(guān)鍵字namespace,后面跟命名空間的名字,然后接一對花括號,花括號中即為命名空間的成員。 命名空間中可以定義變量、函數(shù)、類型和其他命名空間。
namespace N1//命名空間的名字
{
//定義變量
int rand = 10;
//定義函數(shù)
int Add(int left, int right)
{
return left + right;
}
//定義類型
struct Node
{
struct Node* next;
int val;
};
//嵌套命名空間
namespace N2
{
int Sub(int left, int right)
{
return left - right;
}
}
}
注意:
- 一個(gè)命名空間就定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中
- 用一個(gè)工程中允許出現(xiàn)多個(gè)相同名稱的命名空間,編譯器最后會將它們合并為一個(gè)命名空間
3.3 命名空間使用
命名空間的使用三種方式:
- 加命名空間名稱及域作用限定符
namespace N { int a = 10; int b = 5; } int main() { printf("%d\n", N::a); return 0; }
- 使用using將命名空間中某個(gè)成員引入
using N::b; int main() { printf("%d\n", N::a); printf("%d\n", b); return 0; }
- 使用using namespace命名空間名稱引入(展開命名空間)
namespace N { int a = 10; int b = 5; } int a = 20; using namespace N; int main() { printf("%d\n", a); //a不明確,有二義性 printf("%d\n", ::a); //訪問全局的a printf("%d\n", N::a); //訪問N中的a printf("%d\n", b); return 0; }
N中的成員a 就與全局作用域中的a 產(chǎn)生了沖突。這種沖突是允許存在的,但是**要想使用沖突的名字,我們就必須明確指出名字的版本。**main函數(shù)中所有未加限定的a都會產(chǎn)生二義性錯(cuò)誤。
這時(shí)我們必須使用**域作用限定符(:??**來明確指出所需的版本
: :a
來表示全局作用域中的aN: :a
來表示定義在N中的a
注意:
如果命名空間沒有展開,編譯器默認(rèn)是不會搜索命名空間中的變量,去訪問變量是訪問不到的。
訪問的優(yōu)先級:局部域 > 全局域
3.4 命名空間的嵌套
嵌套的命名空間同時(shí)是一個(gè)嵌套的作用域,它嵌套在外層命名空間的作用域中。嵌套的命名空間中的名字遵循的規(guī)則與往常類似:內(nèi)層命名空間聲明的名字將隱藏外層命名空間聲明的同名成員。在嵌套的命名空間中定義的名字只在內(nèi)層命名空間中有效,外層命名空間的代碼想要訪問它必須在名字前添加限定符。
namespace N
{
int a = 10;
namespace N1
{
int a = 20;
int b = 15;
}
namespace N2
{
int c = N1::b;
}
}
int main()
{
printf("%d\n", N::N2::c);
printf("%d\n", N::N1::a);
printf("%d\n", N::a);
return 0;
}
3.5 std命名空間的使用
std是C++標(biāo)準(zhǔn)庫的命名空間,如何展開std使用更合理呢?
- 在日常練習(xí)中,建議直接
using namespace std;
即可,這樣就很方便。 -
using namespace std;
展開,標(biāo)準(zhǔn)庫就全部暴露出來了,如果我們定義跟庫重名的類型、對象、函數(shù),就存在沖突問題。該問題在日常練習(xí)中很少出現(xiàn),但是項(xiàng)目開發(fā)中代碼較多、規(guī)模 大,就很容易出現(xiàn)。所以建議在項(xiàng)目開發(fā)中使用,像std::cout
這樣使用時(shí)指定命名空間例如:using std::cout
展開常用的庫對象、類型等方式。
四、C++輸入和輸出
#include<iostream>
using namespace std;
int main()
{
int a = 0;
double b = 0;
cin >> a >> b;//流提取運(yùn)算法
cout << a << " " << b << endl;//流插入運(yùn)算法 endl相當(dāng)于換行
cout << a << " " << b << '\n';
return 0;
}
我們在項(xiàng)目中要經(jīng)常使用 cout
和 endl
,每次指定命名空間很不方便,直接展開會全部暴露,有沖突風(fēng)險(xiǎn),我們可以指定展開來解決問題。
using std::cout;
using std::endl;
說明:
- 使用**cout標(biāo)準(zhǔn)輸出對象(控制臺)和cin標(biāo)準(zhǔn)輸入對象(鍵盤)**時(shí),必須
包含< iostream >頭文件
以及按命名空間使用方法使用std。cout
和cin
是全局的流對象,endl
是特殊的C++符號,表示換行輸出,他們都包含在包含 < iostream >頭文件中。<<
是流插入運(yùn)算符,>>
是流提取運(yùn)算符。- 使用C++輸入輸出更方便,不需要像 printf和scanf 輸入輸出時(shí)那樣,需要手動控制格式。
C++的輸入輸出可以自動識別變量類型
。
五、缺省參數(shù)
5.1 缺省參數(shù)的定義
缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。
#include<iostream>
using namespace std;
void Test(int a = 0)
{
cout << a << endl;
}
int main()
{
Test();//沒有傳參時(shí),使用參數(shù)的默認(rèn)值a=0
Test(1);//傳參時(shí),使用指定的實(shí)參a=1
}
5.2 缺省參數(shù)分類
- 全缺省參數(shù)(全默認(rèn)參數(shù))–所有參數(shù)都給了缺省值
void Test(int a = 10, int b = 20, int c = 30) { cout << "a = " << a ; cout << " b = " << b ; cout << " c = " << c << endl; } int main() { Test(1, 2, 3); Test(1, 2); Test(1); Test(); return 0; }
全缺省參數(shù)在傳參時(shí),參數(shù)是按照從左往右的順序進(jìn)行缺省的,不能跳著缺省,例如:
Func(1, ,3)
,讓第一個(gè)形參和第三個(gè)形參都使用傳遞值,而讓第二個(gè)參數(shù)使用缺省值,這種做法是不被允許的。
- 半缺省參數(shù) – 部分的參數(shù)給了缺省值
void Test(int a , int b = 20, int c = 30) { cout << "a = " << a ; cout << " b = " << b ; cout << " c = " << c << endl; } int main() { Test(1, 2, 3); Test(1, 2); Test(1); return 0; }
注意:文章來源:http://www.zghlxwxcb.cn/news/detail-817817.html
- 缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn)(最好在聲明給;聲明給,定義給也不可以)
- 缺省值必須是常量或者全局變量。
- 半缺省參數(shù)必須從左到右依次來給出,不能間隔著給
- C語言不支持
文章來源地址http://www.zghlxwxcb.cn/news/detail-817817.html
到了這里,關(guān)于【C++初階】C++入門(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!