移動(dòng)網(wǎng)站建設(shè)哪家好什么平臺可以打廣告做宣傳
朋友們、伙計(jì)們,我們又見面了,本期來給大家解讀一下有關(guān)C++語言的相關(guān)知識點(diǎn),如果看完之后對你有一定的啟發(fā),那么請留下你的三連,祝大家心想事成!
C 語 言 專 欄:C語言:從入門到精通
數(shù)據(jù)結(jié)構(gòu)專欄:數(shù)據(jù)結(jié)構(gòu)
個(gè)? 人? 主? 頁?:stackY、
?
目錄
前言:
1. 什么是C++
2. C++的發(fā)展史
3. C++關(guān)鍵字(C++98)?
4.命名空間
4.1 命名空間定義?
4.2命名空間的使用
4.2.1命名空間使用的三種方式
5.輸入、輸出?
6.缺省參數(shù)
6.1缺省參數(shù)概念
6.2缺省參數(shù)的分類
前言:
在之前的所有的文章我都是用C語言的方式實(shí)現(xiàn)的各種代碼,那么本期往后我將會采用C++語言,那么在本期首先讓我們了解一下C++的基本發(fā)展以及C++相比C語言又需要注意的點(diǎn),話不多說,我們直接開始:
1. 什么是C++
????????C語言是結(jié)構(gòu)化和模塊化的語言,適合處理較小規(guī)模的程序。對于復(fù)雜的問題,規(guī)模較大的程序,需要高度的抽象和建模時(shí),C語言則不合適。為了解決軟件危機(jī), 20世紀(jì)80代, 計(jì)算機(jī)界提出了OOP(object oriented programming:面向?qū)ο?思想,支持面向?qū)ο?/strong>的程序設(shè)計(jì)語言應(yīng)運(yùn)而生。????????1982年,Bjarne Stroustrup博士在C語言的基礎(chǔ)上引入并擴(kuò)充了面向?qū)ο?/strong>的概念,發(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ì)。
C++祖師爺:?本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)
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++的歷史版本。?
? ?階段 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 內(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ū)ο?#xff0c;新增保護(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() 的文 本信息可選, Fold 表達(dá)式用于可變的模板, if 和 switch 語句中的初始化器等 |
C++20 | 自 C++11 以來最大的發(fā)行版 ,引入了許多新的特性,比如: 模塊 (Modules) 、協(xié) 程 (Coroutines) 、范圍 (Ranges) 、概念 (Constraints) 等重大特性,還有對已有 特性的更新:比如 Lambda 支持模板、范圍 for 支持初始化等 |
C++23 | 制定 ing |
3. C++關(guān)鍵字(C++98)?
C++總計(jì)63個(gè)關(guān)鍵字,C語言32個(gè)關(guān)鍵字在C++中的關(guān)鍵字有一部分在C語言階段都以及接觸過了,所以就不對具體的關(guān)鍵字進(jìn)行太多的解釋,在后續(xù)的學(xué)習(xí)中會細(xì)致解釋:![]()
4.命名空間
?在了解命名空間前我們可以先來看一看在屏幕上打印 Hello World! 這個(gè)字符串,C++程序和C語言程序的不同
C語言程序:
//頭文件的包含 #include <stdio.h>//主函數(shù) int main() {//打印函數(shù)printf("Hello World!\n");return 0; }
C++程序:
//頭文件的包含 #include <iostream>//命名空間的展開 using namespace std;//主函數(shù) int main() {//打印cout << "Hello World!" << endl;return 0; }
1. 兩者頭文件的包含有區(qū)別
2. C++中多了一個(gè)命名空間
3. 兩者輸出(打印)函數(shù)有區(qū)別
那么接下來就來了解一下C++中這個(gè)神奇的功能:命名空間
在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用域中,可能會導(dǎo)致很多沖突。使用命名空間的目的是對標(biāo)識符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對這種問題。#include <stdio.h> #include <stdlib.h>int rand = 10;int main() {//C語言沒辦法解決類似這樣的命名沖突問題,所以C++提出了namespace來解決printf("%d\n", rand);return 0; }
這樣的程序是會報(bào)錯(cuò)的(錯(cuò)誤C2365??“rand”: 重定義;以前的定義是“函數(shù)”?),因?yàn)槲覀冏约憾x的變量rand和庫里面的rand名稱沖突,如果要解決就需要重新命名,那么在C++中就提出了namespace來解決這個(gè)問題。
4.1 命名空間定義?
定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對{}即可,{} 中即為命名空間的成員。
1.正常的命名空間定義
命名空間中可以定義變量、函數(shù)、類型
//命名空間的名字是任意的,在這里我使用的是我的名字的縮寫// 1. 正常的命名空間定義 namespace ywh {// 命名空間中可以定義變量/函數(shù)/類型//變量int rand = 0;char ch = 'a';int a[10] = { 0 };//函數(shù)int Add(int x, int y){return x + y;}//類型struct Node{int val;struct Node* next;}; }
?2.命名空間可以進(jìn)行嵌套
//2. 命名空間可以進(jìn)行嵌套 //Test.cpp namespace N1 {int a;int b;int Add(int x, int y){return x + y;}//進(jìn)行嵌套namespace N2{int c;int d;int Sub(int x, int y){return x - y;}} }
3. 允許存在多個(gè)相同名稱的命名空間
頭文件Test.h
//3. 同一個(gè)工程中允許存在多個(gè)相同名稱的命名空間,編譯器最后會合成同一個(gè)命名空間中。 //Test.h namespace N1 {int Mul(int x, int y){return x * y;} }
一個(gè)工程中的T est.h 和上面T est.cpp 中兩個(gè) N1 會被合并成一個(gè)*注意:一個(gè)命名空間就定義了一個(gè)新的作用域 ,命名空間中的所有內(nèi)容都局限于該命名空間中。
4.2命名空間的使用
首先說明C++是兼容C語言的,所以在C++編譯文檔中也是可以使用C語言的。
定義好了命名空間,那么該怎么使用呢?看下面的代碼:
//命名空間的使用 namespace N1 {int a = 10;int b = 20;int Add(int x, int y){return x + y;} }int main() {printf("%d\n", a);return 0; }
這段代碼在編譯的時(shí)候會報(bào)錯(cuò):“a”未聲明的標(biāo)識符。也就是說編譯器不認(rèn)識我們自己定義的命名空間,那么命名空間正確的使用方式是怎么樣的呢?
4.2.1命名空間使用的三種方式
1.加命名空間名稱及作用域限定符?
這里要使用到一個(gè)知識點(diǎn):預(yù)作用限定符“ ::”,在這里它的作用是訪問命名空間成員,使用“ ::”可以指定要訪問的命名空間中的成員。
//命名空間的使用 namespace N1 {int a = 10;int b = 20;int Add(int x, int y){return x + y;} }int main() {//使用預(yù)作用限定符printf("%d\n", N1::a);return 0; }
2.使用using將命名空間中某個(gè)成員引入
//命名空間的使用 //部分展開 using N1::b;namespace N1 {int a = 10;int b = 20;int Add(int x, int y){return x + y;} }int main() {//使用預(yù)作用限定符printf("%d\n", N1::a);//使用usingprintf("%d\n", b);return 0; }
3.使用using namespace 命名空間名稱 引入
//全部展開 using namespace N;namespace N {int a = 1;int b = 0;int Add(int x, int y){return x + y;} }int main() {printf("%d\n", b);printf("%d\n", Add(10,20));return 0; }
看到這里我們就可以對C++代碼的第一行的代碼進(jìn)行解讀:
using namespace std;
std是C++標(biāo)準(zhǔn)庫的命名空間,當(dāng)我們將std全部展開以后就可以直接用標(biāo)準(zhǔn)庫。
5.輸入、輸出?
?我們先來看看C++的輸入和輸出
#include<iostream> // std是C++標(biāo)準(zhǔn)庫的命名空間名,C++將標(biāo)準(zhǔn)庫的定義實(shí)現(xiàn)都放到這個(gè)命名空間中 using namespace std;int main() {//輸入int a = 0;cin >> a;//輸出cout << "Hello world!!!" << endl;cout << "a = " << a << endl;return 0; }
說明:
1. 使用 cout 標(biāo)準(zhǔn)輸出對象 ( 控制臺 ) 和 cin 標(biāo)準(zhǔn)輸入對象 ( 鍵盤 ) 時(shí),必須 包含 < iostream > 頭文件以及按命名空間使用方法使用 std 。2. cout 和 cin 是全局的流對象, endl 是特殊的 C++ 符號,表示換行輸出,他們都包含在包含 <iostream > 頭文件中。3.<< 是流插入運(yùn)算符, >> 是流提取運(yùn)算符。4.于C語言不同的是C++中的輸入和輸出是運(yùn)算符,而C語言中的輸入和輸出是函數(shù)。5.使用 C++ 輸入輸出更方便,不需要像 printf/scanf 輸入輸出時(shí)那樣,需要手動(dòng)控制格式。C++ 的輸入輸出可以自動(dòng)識別變量類型。#include <iostream> using namespace std; int main() {int a;double b;char c;// 可以自動(dòng)識別變量的類型cin >> a;cin >> b >> c;//自動(dòng)識別類型cout << a << endl;cout << b << " " << c << endl;return 0; }
6.缺省參數(shù)
6.1缺省參數(shù)概念
缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。// 缺省參數(shù) void Func(int a = 1) {cout << a << endl; } int main() {// 沒有傳參時(shí),使用參數(shù)的默認(rèn)值Func();// 傳參時(shí),使用指定的實(shí)參Func(10); return 0; }
6.2缺省參數(shù)的分類
?1.全缺省
//全缺省參數(shù) void Fun(int a = 10, int b = 20, int c = 30) {cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;cout << endl; }int main() {// 顯示傳參,從左往右顯示傳參Fun();//傳一個(gè)參數(shù)默認(rèn)只能傳給第一個(gè)參數(shù)Fun(1);Fun(1, 2);Fun(1, 2, 3);//是不能這樣進(jìn)行傳參的//Fun(1, , 3);return 0; }
2.半缺省參數(shù)
//半缺省參數(shù) //必須從右往左給缺省值 void Fun(int a, int b = 20, int c = 30) {cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;cout << endl; }int main() {//半缺省不能傳空Fun(1);Fun(1, 2);Fun(1, 2, 3);return 0; }
注意:
1.? 半缺省參數(shù)必須從右往左依次來給出,不能間隔著給。2.? 缺省參數(shù)不能在函數(shù)和聲明中同時(shí)出現(xiàn)(聲明給,定義不給)。3.??缺省值必須是常量或者全局變量 。4.??C語言不支持(編譯器不支持)。
朋友們、伙計(jì)們,美好的時(shí)光總是短暫的,我們本期的的分享就到此結(jié)束,最后看完別忘了留下你們彌足珍貴的三連喔,感謝大家的支持!?