朋友們、伙計們,我們又見面了,本期來給大家解讀一下有關(guān)C++語言的相關(guān)知識點,如果看完之后對你有一定的啟發(fā),那么請留下你的三連,祝大家心想事成!
C 語 言 專 欄:C語言:從入門到精通
數(shù)據(jù)結(jié)構(gòu)專欄:數(shù)據(jù)結(jié)構(gòu)
個? 人? 主? 頁?: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語言的方式實現(xiàn)的各種代碼,那么本期往后我將會采用C++語言,那么在本期首先讓我們了解一下C++的基本發(fā)展以及C++相比C語言又需要注意的點,話不多說,我們直接開始:
1. 什么是C++
????????C語言是結(jié)構(gòu)化和模塊化的語言,適合處理較小規(guī)模的程序。對于復(fù)雜的問題,規(guī)模較大的程序,需要高度的抽象和建模時,C語言則不合適。為了解決軟件危機, 20世紀(jì)80代, 計算機界提出了OOP(object oriented programming:面向?qū)ο?思想,支持面向?qū)ο?/strong>的程序設(shè)計語言應(yīng)運而生。????????1982年,Bjarne Stroustrup博士在C語言的基礎(chǔ)上引入并擴充了面向?qū)ο?/strong>的概念,發(fā)明了一種新的程序語言。為了表達該語言與C語言的淵源關(guān)系,命名為C++。因此:C++是基于C語言而產(chǎn)生的,它既可以進行C語言的過程化程序設(shè)計,又可以進行以抽象數(shù)據(jù)類型為特點的基于對象的 程序設(shè)計,還可以進行面向?qū)ο蟮某绦蛟O(shè)計。
C++祖師爺:?本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)
2. C++的發(fā)展史
1979年,貝爾實驗室的本賈尼等人試圖分析unix內(nèi)核的時候,試圖將內(nèi)核模塊化,于是在C語言的基礎(chǔ)上進行擴展,增加了類的機制,完成了一個可以運行的預(yù)處理程序,稱之為C with classes。
語言的發(fā)展就像是練功打怪升級一樣,也是逐步遞進,由淺入深的過程。我們先來看下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++98
|
C++
標(biāo)準(zhǔn)第一個版本
,絕大多數(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)第二個版本,語言特性無大改變,主要:修訂錯誤、減少多異性
|
C++05
|
C++
標(biāo)準(zhǔn)委員會發(fā)布了一份計數(shù)報告
(Technical Report
,
TR1)
,正式更名
C++0x
,即:計劃在本世紀(jì)第一個
10
年的某個時間發(fā)布
|
C++11
|
增加了許多特性,使得
C++
更像一種新語言,比如:正則表達式、基于范圍
for
循
環(huán)、
auto
關(guān)鍵字、新容器、列表初始化、標(biāo)準(zhǔn)線程庫等
|
C++14
|
對
C++11
的擴展,主要是修復(fù)
C++11
中漏洞以及改進,比如:泛型的
lambda
表
達式,
auto
的返回值類型推導(dǎo),二進制字面常量等
|
C++17
|
在
C++11
上做了一些小幅改進,增加了
19
個新特性,比如:
static_assert()
的文
本信息可選,
Fold
表達式用于可變的模板,
if
和
switch
語句中的初始化器等
|
C++20
|
自
C++11
以來最大的發(fā)行版
,引入了許多新的特性,比如:
模塊
(Modules)
、協(xié)
程
(Coroutines)
、范圍
(Ranges)
、概念
(Constraints)
等重大特性,還有對已有
特性的更新:比如
Lambda
支持模板、范圍
for
支持初始化等
|
C++23
|
制定
ing
|
3. C++關(guān)鍵字(C++98)?
C++總計63個關(guān)鍵字,C語言32個關(guān)鍵字在C++中的關(guān)鍵字有一部分在C語言階段都以及接觸過了,所以就不對具體的關(guān)鍵字進行太多的解釋,在后續(xù)的學(xué)習(xí)中會細致解釋:![]()
4.命名空間
?在了解命名空間前我們可以先來看一看在屏幕上打印 Hello World! 這個字符串,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++中多了一個命名空間
3. 兩者輸出(打印)函數(shù)有區(qū)別
那么接下來就來了解一下C++中這個神奇的功能:命名空間
在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用域中,可能會導(dǎo)致很多沖突。使用命名空間的目的是對標(biāo)識符的名稱進行本地化,以避免命名沖突或名字污染,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; }
這樣的程序是會報錯的(錯誤C2365??“rand”: 重定義;以前的定義是“函數(shù)”?),因為我們自己定義的變量rand和庫里面的rand名稱沖突,如果要解決就需要重新命名,那么在C++中就提出了namespace來解決這個問題。
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.命名空間可以進行嵌套
//2. 命名空間可以進行嵌套 //Test.cpp namespace N1 { int a; int b; int Add(int x, int y) { return x + y; } //進行嵌套 namespace N2 { int c; int d; int Sub(int x, int y) { return x - y; } } }
3. 允許存在多個相同名稱的命名空間
頭文件Test.h
//3. 同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中。 //Test.h namespace N1 { int Mul(int x, int y) { return x * y; } }
一個工程中的T est.h 和上面T est.cpp 中兩個 N1 會被合并成一個*注意:一個命名空間就定義了一個新的作用域 ,命名空間中的所有內(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; }
這段代碼在編譯的時候會報錯:“a”未聲明的標(biāo)識符。也就是說編譯器不認(rèn)識我們自己定義的命名空間,那么命名空間正確的使用方式是怎么樣的呢?
4.2.1命名空間使用的三種方式
1.加命名空間名稱及作用域限定符?
這里要使用到一個知識點:預(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將命名空間中某個成員引入
namespace N1 { int a = 10; int b = 20; int Add(int x, int y) { return x + y; } } //命名空間的使用 //部分展開 using N1::b; int main() { //使用預(yù)作用限定符 printf("%d\n", N1::a); //使用using printf("%d\n", b); return 0; }
3.使用using namespace 命名空間名稱 引入
namespace N { int a = 1; int b = 0; int Add(int x, int y) { return x + y; } } //全部展開 using namespace N; int main() { printf("%d\n", b); printf("%d\n", Add(10,20)); return 0; }
看到這里我們就可以對C++代碼的第一行的代碼進行解讀:
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)庫的定義實現(xiàn)都放到這個命名空間中 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)輸入對象 ( 鍵盤 ) 時,必須 包含 < iostream > 頭文件以及按命名空間使用方法使用 std 。2. cout 和 cin 是全局的流對象, endl 是特殊的 C++ 符號,表示換行輸出,他們都包含在包含 <iostream > 頭文件中。3.<< 是流插入運算符, >> 是流提取運算符。4.于C語言不同的是C++中的輸入和輸出是運算符,而C語言中的輸入和輸出是函數(shù)。5.使用 C++ 輸入輸出更方便,不需要像 printf/scanf 輸入輸出時那樣,需要手動控制格式。C++ 的輸入輸出可以自動識別變量類型。#include <iostream> using namespace std; int main() { int a; double b; char c; // 可以自動識別變量的類型 cin >> a; cin >> b >> c; //自動識別類型 cout << a << endl; cout << b << " " << c << endl; return 0; }
6.缺省參數(shù)
6.1缺省參數(shù)概念
缺省參數(shù)是聲明或定義函數(shù)時為函數(shù)的參數(shù)指定一個缺省值。在調(diào)用該函數(shù)時,如果沒有指定實參則采用該形參的缺省值,否則使用指定的實參。// 缺省參數(shù) void Func(int a = 1) { cout << a << endl; } int main() { // 沒有傳參時,使用參數(shù)的默認(rèn)值 Func(); // 傳參時,使用指定的實參 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(); //傳一個參數(shù)默認(rèn)只能傳給第一個參數(shù) Fun(1); Fun(1, 2); Fun(1, 2, 3); //是不能這樣進行傳參的 //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; }
注意:文章來源:http://www.zghlxwxcb.cn/news/detail-723454.html
1.? 半缺省參數(shù)必須從右往左依次來給出,不能間隔著給。2.? 缺省參數(shù)不能在函數(shù)和聲明中同時出現(xiàn)(聲明給,定義不給)。3.??缺省值必須是常量或者全局變量 。4.??C語言不支持(編譯器不支持)。
朋友們、伙計們,美好的時光總是短暫的,我們本期的的分享就到此結(jié)束,最后看完別忘了留下你們彌足珍貴的三連喔,感謝大家的支持!?文章來源地址http://www.zghlxwxcb.cn/news/detail-723454.html
到了這里,關(guān)于從C語言到C++:C++入門知識(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!