C++學(xué)習(xí)(c++17)——1.1 C++基礎(chǔ)知識

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>

  1. 需要<cstddef>頭文件。
  2. 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)行簡單包裝。

好處:

  1. 總是知道自身大小。
  2. 不會自動轉(zhuǎn)換為指針,從而避免了某些bug。
  3. 具有迭代器,可以方便地遍歷元素。
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;
}

初始化列表是類型安全的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容