一.什么是C++
C語言是結構化和模塊化的語言,適合處理較小規模的程序。對于復雜的問題,規模較大的程序,需要高度 的抽象和建模時,C語言則不合適。為了解決軟件危機, 20世紀80年代, 計算機界提出了OOP(object oriented programming:面向對象)思想,支持面向對象的程序設計語言應運而生。
1982年,Bjarne Stroustrup博士在C語言的基礎上引入并擴充了面向對象的概念,發明了一種新的程序語 言。為了表達該語言與C語言的淵源關系,命名為C++。因此:C++是基于C語言而產生的,它既可以進行C語 言的過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行面向對象的程序設計。
C++的發展史
1979年,貝爾實驗室的本賈尼等人試圖分析unix內核的時候,試圖將內核模塊化,于是在C語言的基礎上進行擴展,增加了類的機制,完成了一個可以運行的預處理程序,稱之為C with classes。
C++的歷史版本:
?C++的關鍵字
在(C++98)版本中,相較于C語言C++增加了31個關鍵字,一共63個。
二、命名空間?
在C/C++中,變量、函數和類都是大量存在的,這些變量、函數和類的名稱都將作用于全局作用域中,可能會導致很多命名沖突。使用命名空間的目的就是對標識符和名稱進行本地化,以避免命名沖突或名字污染,namespace關鍵字的出現就是針對這種問題的。
命名空間定義
定義命名空間,需要使用到 namespace 關鍵字,后面跟命名空間的名字,然后接一對{}中即為命名空間的成員。
普通定義
namespace swean
{int rand = 10;int Add(int left, int right){return left + right;}}
嵌套定義
namespace swean
{int rand = 10;namespace swean1{int rand = 1;}
}
空間合并
同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會將其成員合成在同一個命名空間中,所以我們不能在同一個命名空間中定義兩個相同名稱的成員。
命名空間使用
那么,命名空間應該如何使用呢,我們有以下三種方法:
加命名空間名稱及作用域限定符?
符號“::”在C++中叫做域作用限定符,我們通過“命名空間名稱::命名空間成員”便可以訪問到命名空間中相應的成員。:: 的左邊為域,如果有命名空間域,則限定訪問命名空間域中的內容,如果域左邊為空,訪問的就是全局域,會直接到全局范圍內找 :: 右邊的變量或其他。
int rand = 0;namespace swean
{int rand = 10;namespace swean1{int rand = 1;}
}int main()
{//printf("%d\n", rand);//域作用限定符printf("%p\n", rand);printf("%d\n", swean::rand);printf("%d\n", swean::swean1::rand);return 0;
}
使用using將命名空間中的成員引入
?用“using 命名空間名稱::命名空間成員”的方式將命名空間中指定的成員引入。這樣一來,在該語句之后的代碼中就可以直接使用引入的成員變量了。
#include <stdio.h>
namespace swean
{int rand;
}
using swean::rand;
int main()
{rand = 10;printf("%d\n", rand);return 0;
}
使用using namespace 命名空間名稱引入
通過”using namespace 命名空間名稱“將命名空間中的全部成員引入。這樣一來,在該語句之后的代碼中就可以直接使用該命名空間內的全部成員了。?
#include <stdio.h>
namespace swean
{int rand;
}
using namespace swean;
int main()
{rand = 10;printf("%d\n", rand);return 0;
}
?三、C++輸入&輸出
#include<iostream>
//std是C++標準庫的命名空間
//using namespace std;
using std::cout;
using std::endl;int main()
{// << 流插入運算符cout << "hello world" << "\n";std::cout << "hello world" << std::endl;int i = 0;// << 流提取std::cin >> i;return 0;
}
1. 使用cout標準輸出對象(控制臺)和cin標準輸入對象(鍵盤)時,必須包含< iostream >頭文件 以及按命名空間使用方法使用std。
2. cout和cin是全局的流對象,endl是特殊的C++符號,表示換行輸出,他們都包含在包含< iostream >頭文件中。
3. >是流提取運算符。
4. 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時那樣,需要手動控制格式。 C++的輸入輸出可以自動識別變量類型。
#include <iostream>
using namespace std;
int main()
{int i;double d;char arr[20];cin >> i;//讀取一個整型cin >> d;//讀取一個浮點型cin >> arr;//讀取一個字符串cout << i << endl;//打印整型icout << d << endl;//打印浮點型dcout << arr << endl;//打印字符串arrreturn 0;
}
四、缺省參數
缺省參數概念
缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實 參則采用該形參的缺省值,否則使用指定的實參。
void func(int a = 1)
{cout << a << endl;
}
缺省參數分類
全缺省參數
全缺省參數,即函數的全部形參都設置為缺省參數。
//全缺省
void func1(int a = 10, int b = 10, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
半缺省參數
半缺省參數必須從右往左依次給出,不能間隔著給。傳參時必須連續,缺省值使用必須從右往左連續使用?
//半缺省
void func2(int a, int b = 10, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
注意:
缺省參數不能在函數聲明和定義中同時出現
一般是,聲明時給缺省值,定義不給。.
//錯誤案例void func1(int a = 10, int b = 10, int c = 30);
void func1(int a = 10, int b = 10, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
缺省值必須是常量或者全局變量。
五、函數重載
函數重載概念
函數重載是函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這 些同名函數的形參列表(參數個數 或 類型 或 類型順序)不同,常用來處理實現功能類似數據類型 不同的問題。
#include <iostream>
using namespace std;
int Add(int x, int y)
{return x + y;
}double Add(double x, double y)
{return x + y;
}int main()
{cout << Add(1, 2) << endl;cout << Add(1.1, 2.2) << endl;return 0;
}
函數重載的原理--名字修飾
為什么C++支持函數重載,而C語言不支持函數重載呢? 在C/C++中,一個程序要運行起來,需要經歷以下幾個階段:預處理、編譯、匯編、鏈接。
在C語言中,匯編階段進行符號匯總時,一個函數匯總后的符號就是其函數名,所以當匯總時發現多個相同的函數符號時,編譯器便會報錯。
?
而 C++ 在進行符號匯總時,對函數的名字修飾做了改動,函數匯總出的符號不只是函數的函數名,而是通過其參數的類型和個數以及順序等信息匯總出 一個符號,這樣一來,就算是函數名相同的函數,只要其參數的類型或參數的個數或參數的順序不同,那么匯總出來的符號也就不同了。
vs:
gcc:
?