C++學(xué)習(xí)(c++17)——1.1 C++基礎(chǔ)知識
? 假期花了2個月,連滾帶爬地白嫖完C++的一個教學(xué)視頻(總時長144h),然后開始嘗試去運(yùn)用知識做一些小項目。但實驗室的大佬吳學(xué)長的魔鬼提問把我又打回原形,然后這次準(zhǔn)備拿著資料去踏踏實實學(xué)習(xí)(把Cpppp放在學(xué)校宿舍真是一個錯誤的決定。) 這次的學(xué)習(xí)主要圍繞的是c++17的一些特性,并且鞏固假期里面看視頻學(xué)習(xí)的c++?!緦W(xué)校有小程序大賽,又有老師組織的論文學(xué)習(xí)的作業(yè),啊啊啊,我想學(xué)會分身術(shù)】
[TOC]
命名空間
C++17允許方便地使用嵌套的命名空間。
c++17前:
namespace MyLibraries{
namespace NetWorking{
namespace FTP{
/*...*/
}
}
}
C++17:
namespace MyLibraries::NetWorking::FTP{
/*...*/
}
//同時可使用名稱空間別名:
namespace MyFTP = MyLibraries::NetWorking::FTP;
字面量
數(shù)值字面量中可以使用數(shù)字分隔符(一個單引號),例如
- 23'456'789
- 0.123'456f
C++17中增加了對十六進(jìn)制浮點字面量的支持,如0x3.ABCp-10、0Xb.cp123(p-10指*2的-10次方)
數(shù)據(jù)類型
C++17中增加了std::byte來表示單個字節(jié)(在c++17之前,用字符或無符號字符來表示一個字節(jié),但那些類型感覺像在處理字符。std::byte則指明意圖——內(nèi)存中的單個字節(jié))
std::byte b{42};
<u>注意</u>:
- 需要<cstddef>頭文件。
- std::byte的初始化需要使用單元素列表進(jìn)行直接列表初始化。
枚舉類型
建議用類型安全的enum class強(qiáng)類型枚舉來替代類型不安全的enum枚舉。
條件語句
if語句
C++17中允許在if語句中包括一個初始化器,語法如下:if (<initializer>;<conditional_expression>) {<body>}。<initializer>中引入的變量只在<conditional_expression>和<body>中可用。
switch語句
當(dāng)一個case表達(dá)式后的語句執(zhí)行完后,如果沒有遇到"break",則會繼續(xù)執(zhí)行下一個case后的語句,這被稱為"fallthrough"。(因為它經(jīng)常成為bug來源,所以編譯器會生成警告信息)
C++17中,可用使用[[fallthrough]]特性,來告訴編譯器這是特意為之。
C++17中,switch和if一樣支持使用初始化器:switch(<initializer>;<expresson>) {<body>}
函數(shù)
函數(shù)返回類型的推斷(auto)
C++14允許要求編譯器自動推斷出函數(shù)的返回類型。要使用這個功能,需要把a(bǔ)uto指定為返回類型:
auto addNumber(int number1,int number2){
return number1 + number2;
}
編譯器根據(jù) return后的表達(dá)式 推斷返回類型。函數(shù)中可以有多個return,但是應(yīng)該解析為同種返回類型。也可以包含遞歸調(diào)用,但是第一個return語句必須是非遞歸調(diào)用(有遞歸出口)。
當(dāng)前函數(shù)的名稱(______func______)
? 每個函數(shù)都有一個預(yù)定義的局部變量______func______,其中包含當(dāng)前函數(shù)的名稱。這個變量的一個用途是用于日志記錄。
數(shù)組
C風(fēng)格的數(shù)組【建議改用array和vector】
要獲取基于棧的c風(fēng)格數(shù)組的大?。ㄔ貍€數(shù)),可以使用C++17 std::size()函數(shù)(需要<array>頭文件)。例如
int myArray[3];
unsigned int arraySize = std::size(myArray);
C++17之前獲取元素個數(shù):
unsigned int arraySize = sizeof(myArray) / sizeof(myArray[0])//sizeof操作符返回實參的大小(單位為字節(jié))
std::array
std::array是一種大小固定的特殊容器?;旧鲜菍風(fēng)格數(shù)組進(jìn)行簡單包裝。
好處:
- 總是知道自身大小。
- 不會自動轉(zhuǎn)換為指針,從而避免了某些bug。
- 具有迭代器,可以方便地遍歷元素。
array<int, 3> arr = {1,2,3}
cout << "Array size:" << arr.size()<<";";
cout << "2nd element:" << arr[1];
上述代碼的輸出結(jié)果為Array size:3;2nd element:2。
std::vector
標(biāo)準(zhǔn)庫提供的多個不同的非固定大小容器之一。vector是動態(tài)的,可以在運(yùn)行時添加或者刪除元素。
//Create a vector of integers
vector<int> myVector = { 11, 22};
//Add some more integers to the vector using push_back()
myVector.push_back(33);
myVector.push_back(44);
//Access elements
cout << "1st element: "<< myVector[0] << endl;
結(jié)構(gòu)化綁定(structured bindings)
結(jié)構(gòu)化綁定允許使用數(shù)組、結(jié)構(gòu)、pair或元組中的元素來初始化多個變量。
例如,假設(shè)有下面的數(shù)組:
std::array<int, 3> values = {11, 22, 33};
那么可以同時聲明三個變量,用這個數(shù)組來進(jìn)行初始化【注意,結(jié)構(gòu)化綁定必須要使用auto關(guān)鍵字】
auto [x, y, z] = values;
綁定的變量個數(shù)必須和右側(cè)表達(dá)式中值個數(shù)一樣。
且當(dāng)所以非靜態(tài)成員都是公有的情況下,才能將結(jié)構(gòu)化綁定用于結(jié)構(gòu)(struct)。
基于區(qū)間的for循環(huán)(Range-Based for Loop)
這是除了原本的while、do-while(至少執(zhí)行一次的循環(huán))、for循環(huán)外的第四種。這種循環(huán)允許方便地迭代容器中的元素??捎糜贑風(fēng)格的數(shù)組、初始化列表,也可以用于具有返回迭代器的begin()和end()函數(shù)的類型,如std::array,std::vector等標(biāo)準(zhǔn)庫容器。
std::array<int, 4> arr = {1, 2, 3, 4};
for(int i : arr){
std::cout << i << std::endl;
}
(若想迭代元素時不制作副本,則應(yīng)使用引用變量)
初始化列表
在頭文件<initializer_list>頭文件中定義。利用初始化列表,可以用于可變數(shù)量參數(shù)的函數(shù)。
#include <initializer_list>
using namespace std;
int makeSum(initializer_list<int> 1st){
int total = 0;
for(int value : 1st){
total += value;
}
return total;
}
初始化列表是類型安全的。