C++初識
- 1 C++的前世今生
- 1.1 什么是C++
- 1.2 C++發展史
- 1.3 C++的重要性
- 1.3.1 語言使用廣泛度
- 1.3.2 學習和作業
- 2 C++入門
- 2.1 C++關鍵字
- 2.2 命名空間
- 2.2.1 命名空間定義
- 2.2.1 命名空間使用
- 2.3 輸入&輸出
- 2.4 預設引數
- 2.4.1 預設引數概念
- 2.4.2 預設引數分類
- 2.5 函式多載
- 2.5.1 函式多載的概念
- 2.5.2 C++函式的多載的原理和C不可以函式多載的原因
1 C++的前世今生
1.1 什么是C++
C語言是結構化和模塊化的語言,適合處理較小規模的程式,對于復雜的問題,規模較大的程式,需要高度
的抽象和建模時,C語言則不合適,為了解決軟體危機, 20世紀80年代, 計算機界提出了OOP(object
oriented programming:面向物件)思想,支持面向物件的程式設計語言應運而生,
1982年,Bjarne Stroustrup博士在C語言的基礎上引入并擴充了面向物件的概念,發明了一種新的程式語
言,為了表達該語言與C語言的淵源關系,命名為C++,因此:C++是基于C語言而產生的,它既可以進行C語
言的程序化程式設計,又可以進行以抽象資料型別為特點的基于物件的程式設計,還可以進行面向物件的程
序設計,
就是下面這位大佬發明的C++

怎么樣狠帥吧!
1.2 C++發展史
1979年,貝爾實驗室的本賈尼等人試圖分析unix內核的時候,試圖將內核模塊化,于是在C語言的基礎上進
行擴展,增加了類的機制,完成了一個可以運行的預處理程式,稱之為C with classes,
后來不斷完善和進化,
1.3 C++的重要性
1.3.1 語言使用廣泛度

一般將C和C++放在一起
1.3.2 學習和作業
個人認為深入學習C++和C語言,對理解其他編程語言有很大的幫助,作業上,用到C++的開發也很多,
2 C++入門
2.1 C++關鍵字
C++有61個關鍵字,C語言有32個關鍵字,

2.2 命名空間
在C/C++中,變數、函式和后面要學到的類都是大量存在的,這些變數、函式和類的名稱將都存在于全域作
用域中,可能會導致很多沖突,使用命名空間的目的是對識別符號的名稱進行本地化,以避免命名沖突或名字
污染,namespace關鍵字的出現就是針對這種問題的,
2.2.1 命名空間定義
定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名
空間的成員,
//1. 普通的命名空間
namespace N1 // N1為命名空間的名稱
{
// 命名空間中的內容,既可以定義變數,也可以定義函式
int a;
int Add(int left, int right)
{
return left + right;
}
}
//2. 命名空間可以嵌套
namespace N2
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N3
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
//3. 同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中,
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}
注意:一個命名空間就定義了一個新的作用域,命名空間中的所有內容都局限于該命名空間中
2.2.1 命名空間使用
命名空間中成員該如何使用呢?比如:
namespace N {
int a = 10;
int b = 20;
int Add(int left, int right)
{
return left + right;
}
int Sub(int left, int right)
{
return left - right;
}
}
int main()
{
printf("%d\n", a); // 該陳述句編譯出錯,無法識別a
return 0;
}
命名空間的使用有三種方式:
- 加命名空間名稱和作用域限定符
int main()
{
printf("%d\n", N::a);
return 0;
}
- 使用using將命名空間中成員引入
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
- 使用using namespace 命名空間名稱引入,但是這種做法過于暴力,容易命名沖突,在實際的開發中不建議用,
using namespce N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}
2.3 輸入&輸出
直接上代碼:
#include<iostream>
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0;
}
- 使用cout標準輸出(控制臺)和cin標準輸入(鍵盤)時,必須包含< iostream >頭檔案以及std標準命名空
間,
注意:早期標準庫將所有功能在全域域中實作,宣告在.h后綴的頭檔案中,使用時只需包含對應頭檔案
即可,后來將其實作在std命名空間下,為了和C頭檔案區分,也為了正確使用命名空間,規定C++頭文
件不帶.h;舊編譯器(vc 6.0)中還支持<iostream.h>格式,后續編譯器已不支持,因此推薦使用
+std的方式,- 使用C++輸入輸出更方便,不需增加資料格式控制,比如:整形–%d,字符–%
2.4 預設引數
2.4.1 預設引數概念
大家知道什么是備胎嗎?C++中函式的引數也可以配備胎,
預設引數是宣告或定義函式時為函式的引數指定一個默認值,在呼叫該函式時,如果沒有指定實參則采用該
默認值,否則使用指定的實參,
void TestFunc(int a = 0) {
cout<<a<<endl; }
int main()
{
TestFunc(); // 沒有傳參時,使用引數的默認值
TestFunc(10); // 傳參時,使用指定的實參
}
2.4.2 預設引數分類
- 全預設引數
void TestFunc(int a = 10, int b = 20, int c = 30) {
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl; }
- 半預設引數
void TestFunc(int a, int b = 10, int c = 20) {
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
注意:
半預設引數必須從右往左依次來給出,不能間隔著給
預設引數不能在函式宣告和定義中同時出現
2.5 函式多載
自然語言中,一個詞可以有多重含義,人們可以通過背景關系來判斷該詞真實的含義,即該詞被多載了,
比如:以前有一個笑話,國有兩個體育專案大家根本不用看,也不用擔心,一個是乒乓球,一個是男足,前
者是“誰也贏不了!”,后者是“誰也贏不了!”
2.5.1 函式多載的概念
函式多載:是函式的一種特殊情況,C++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的
形參串列(引數個數 或 型別 或 順序)必須不同,常用來處理實作功能類似資料型別不同的問題
int add(int left,int right)
{
return left+right;
}
double Add(double left, double right)
{
return left+right;
}
long Add(long left, long right)
{
return left+right;
}
int main()
{
Add(10, 20);
Add(10.0, 20.0);
Add(10L, 20L);
return 0;
}
2.5.2 C++函式的多載的原理和C不可以函式多載的原因
為什么C++支持函式多載,而C語言不支持函式多載呢?
在C/C++中,一個程式要運行起來,需要經歷以下幾個階段:預處理、編譯、匯編、鏈接,
假設有test.h test.cpp main.c多檔案結構的源檔案


在鏈接生成執行檔案的時候;因為main.cpp中呼叫了在test.cpp中的Mul函式,所以匯編生成的.o檔案會找到Mul函式的地址,要是只是宣告了Mul函式沒有定義,那么就會發生鏈接錯誤,如果都正常,會找到上圖中的函式地址,而且是通過函式名字去找的,這是C不能函式多載的關鍵因為C源程式經過預處理、編譯形成的匯編代碼中函式名和C++經過預處理、編譯形成的匯編代碼中函式名的命名規則不同,導致在同名函式存在時鏈接時C編譯器就會不知道鏈接哪一個就會出錯,而C++編譯器則不會(在linux中說明這個問題)
型首字母】, 我在linux環境下把C和C++在編譯時候的函式名問題演示一下,就明白了,
源檔案:main.c和C編譯器形成的目標檔案:mainc C++編譯器形成的目標檔案:maincpp

這是main.c中的代碼

objdump -S maincpp/mainc 通過這個指定可以查看匯編資訊中的函式名


我們發現二者的函式名字不同,C++把引數型別的首字母和函式名字的長度也加進去了,到這C++支持函式多載,而C不支持就不言而喻了吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255143.html
標籤:AI
下一篇:使用nginx配置https
