最常使用的現代C++新特性介紹

現代 C++泛指的是從 C++11 之后的 C++標準. 從 C++11 開始, C++標準委員會實行班車制, 沒三年發布一個新版本, 如果一個功能在新版本發布之前已經準備好, 則可以加入該版本中, 否則延后到下一個版本.

語言核心

自 C++11 開始, 語言語法層面加了許多語法糖, 還有增加了一些新語法.使得 C++語言更加簡潔, 更加易讀, 同時更不容易出錯.

auto自動類型推導

auto允許程序員在聲明變量的時候讓編譯器自動推導變量的類型, 而不需要顯式聲明變量的類型.

#include <string>int main() {auto x = 1;auto s = "Hello";auto str = std::string("World");// C++11 之前std::string::iterator it1 = str.begin();// C++11 之后auto it = str.begin();
}

if/switch中聲明變量

增加了語法糖, 允許在if/switch中聲明一個變量, 這樣一方面簡化寫法, 另一方面限制了變量的可見范圍, 提高安全性.

#include <fcntl.h>
#include <unistd.h>#include <iostream>char getOption() { return 'y'; }
int main() {if (auto ret = open("output.txt", O_RDONLY); ret != -1) {std::cout << "open file success" << std::endl;close(ret);}switch (auto c = getOption(); c) {case 'y':[[fallthrough]];case 'Y':std::cout << "yes" << std::endl;break;default:break;}
}

Range based for loop

增加了語法糖, 可以簡化for循環寫法, 并同時提升安全性.

#include <vector>
#include <print>int main() {// 遍歷 vectorstd::vector v{1, 2, 3};for (auto num : v) {std::println("{}", num);}// 遍歷數組int array[] = {1, 2, 3};for (auto num : array) {std::println("{}", num);}
}

結構化綁定

#include <map>
#include <print>
#include <string>int main() {std::map<std::string, int> map = {{"a", 1}, {"b", 2}};for (auto [key, value] : map) {std::println("{}:{}", key, value);}// bind to tupleauto tuple = std::make_tuple(1, 2, 3);auto [a, _, c] = tuple;std::println("a={}", a);
}

統一初始化

支持通過花括號{}初始化任意類型的變量. 對泛型編程的場景幫助很大.

#include <string>
#include <vector>int main() {int a{0};std::string str{"Hello"};struct S {std::string name;float num;S(std::string s, float f) : name(s), num(f) {}};S s1{"Alan", 2.7};std::vector<S> v{s1, {"Bob", 85.9}};
}

進一步閱讀: C++ 類成員初始化發展歷程(從 C++11 到 C++20)

移動語義

移動語義是 C++11 引入的, 主要用來減少不必要的拷貝, 提升性能. 對于一些臨時變量, 或者說不會再使用的變量, 則可以采用移動語義來減少拷貝.

#include <string>
#include <vector>std::string GetStr() { return "Hello"; }
int main() {std::vector<std::string> vec;auto s = GetStr();vec.emplace_back(s);             // copyvec.emplace_back(s + "World");   // movevec.emplace_back(GetStr());      // movevec.emplace_back(std::move(s));  // movereturn 0;
}

進一步閱讀: C++ 必知必會: 移動語義(Move Semantics)

lambdas 表達式

在編程中經常會用到一些臨時函數或者工具函數, 只在局部使用, 并且功能簡單. 以往的方式會造成聲明語使用位置相距比較遠, 影響可讀性. lambda 表達式可以允許我們定義一個臨時的函數, 并且可以省略函數名.

#include <algorithm>
#include <string>
#include <vector>int main() {struct Record {std::string s1;std::string s2;};std::vector<Record> v = {{"A", "1"}, {"B", "0"}, {"a", "2"}};std::sort(v.begin(), v.end(), [](const auto& p1, const auto& p2) {return p1.s1 < p2.s1 || (p1.s1 == p2.s1 && p1.s2 < p2.s2);});
}

進一步閱讀: C++ Lambda 表達式: 簡潔與高效的完美結合

constexpr

constexpr 用來聲明一個常量表達式, 可以在編譯期計算出結果, 并且可以避免運行時計算. 相比起宏定義, constexpr 更加類型安全, 因為本質上講define是字符串替換, 沒有類型檢查.

#define SIZE 64
constexpr int size = 64;

進一步閱讀:

  • C++ constexpr, consteval 和 constinit 簡要介紹
  • C++ 中的 const 和 constexpr: 深入對比與最佳實踐

標準庫

多線程編程

  1. 線程(std::thread/std::jthread). C++11 引入了線程, 并在 C++20 加入了滿足 RAII 要求的jthread. 詳情參考: C++20 std::jthread 完全指南 - 簡化多線程編程與線程管理
  2. 原子變量(std::atomic): 是一種特殊的變量類型, 它支持原子操作, 這些操作在多線程環境下是不可分割的, 也就是不會被其他線程的操作打斷. 這有助于避免多線程訪問共享資源時產生的數據競爭問題, 保證數據安全. 進一步閱讀: Modern C++ 中的 std::atomic 簡介
  3. 互斥鎖(std::mutex): 是一種同步機制, 它保證多個線程對共享資源的訪問是互斥的. 進一步閱讀: 現代 C++鎖介紹
  4. Latch 和 Barrier: 線程同步機制, 它們可以確保多個線程在某個事件發生之前不會繼續執行. 進一步閱讀: C++ Latch 和 Barrier: 新手指南

工具類

  1. string_view: 輕量級視圖, 它只包含對數據的引用, 不包含數據本身. 可以簡單理解為包含了字符串的指針和長度. 詳情參考: 深入理解 C++ std::string_view — 高效字符串操作的利器
  2. optional: 顧名思義, 這個工具包含的數據可能為空, 通常用于表示一個可選的值. 進一步閱讀: 現代 C++ 必備知識: 解鎖 std::optional, std::variant 和 std::any
  3. variant: 是對于傳統的union的一種更安全的替代. 可以保存多個類型的值, 但是只能存儲其中一個.
  4. any: any相對于一個特定類型的值就好比void *對于一種特定類型的指針. any可以被賦值為任何類型, 但是只能讀取為原始類型.
  5. expected: 對于返回值+錯誤提示的一種通用表示, 在成功的情況下返回一個可用的值, 否則返回對應的錯誤類型. 進一步閱讀: 解讀 C++23 std::expected 函數式寫法

總結

本文是對現代 C++新特性的一個簡單介紹, 只包含了筆者認為的常用特性, 對細節感興趣的朋友請查閱相關資料進一步閱讀. 這里也有我按版本整理的新特性介紹: 現代 C++, 有興趣的讀者可以進一步瀏覽.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73849.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL Server:當在刪除數據庫時因為存在觸發器而無法刪除

當在刪除數據庫時因為存在觸發器而無法刪除&#xff0c;你可以通過禁用觸發器來解決這個問題。下面為你介紹在 SQL Server 里禁用和啟用觸發器的方法。 禁用數據庫中所有表的觸發器 你可以使用系統視圖 sys.triggers 來查詢數據庫里所有的觸發器&#xff0c;然后生成禁用這些…

【Linux篇】進程入門指南:操作系統中的第一步

步入進程世界&#xff1a;初學者必懂的操作系統概念 一. 馮諾依曼體系結構1.1 背景與歷史1.2 組成部分1.3 意義 二. 進程2.1 進程概念2.1.1 PCB&#xff08;進程控制塊&#xff09; 2.2 查看進程2.2.1 使用系統文件查看2.2.2 使?top和ps這些??級?具來獲取2.2.3 通過系統調用…

銷售易vs紛享銷客:制造行業CRM選型深度解析

“以客戶為中心”&#xff0c;顧名思義就是指讓客戶貫穿企業市場、研發、生產、銷售、服務全流程&#xff0c;以客戶需求為導向進行經營。CRM作為企業數字化建設基礎設施&#xff0c;在企業高質量發展進程中扮演著重要角色。在眾多CRM解決方案中&#xff0c;騰訊旗下CRM銷售易憑…

【JavaScript】九、JS基礎練習

文章目錄 1、練習&#xff1a;對象數組的遍歷2、練習&#xff1a;猜數字3、練習&#xff1a;生成隨機顏色 1、練習&#xff1a;對象數組的遍歷 需求&#xff1a;定義多個對象&#xff0c;存數組&#xff0c;遍歷數據渲染生成表格 let students [{ name: 小明, age: 18, gend…

代碼隨想錄day31 貪心part05

56.合并區間 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff1a;in…

《C++11:通過thread類編寫C++多線程程序》

關于多線程的概念與理解&#xff0c;可以先了解Linux下的底層線程。當對底層線程有了一定程度理解以后&#xff0c;再學習語言級別的多線程編程就輕而易舉了。 【Linux】多線程 -&#xff1e; 從線程概念到線程控制 【Linux】多線程 -&#xff1e; 線程互斥與死鎖 語言級別的…

c++位運算總結

在C中&#xff0c;位運算是對二進制位進行操作的運算&#xff0c;主要有以下幾種&#xff1a; 1. 按位與&#xff08; & &#xff09;&#xff1a;兩個操作數對應位都為1時&#xff0c;結果位才為1&#xff0c;否則為0。例如 3 & 5 &#xff0c; 3 二進制是 0000 0011…

1.1 計算機網絡的概念

首先來看什么是計算機網絡&#xff0c;關于計算機網絡的定義并沒有一個統一的標準&#xff0c;不同的教材有 不同的說法&#xff08;這是王道書對于計算機網絡的定義&#xff09;&#xff0c;我們可以結合自己的生活經驗去體會這個 定義。 可以用不同類型的設備去連接計算機網絡…

用LLama factory時報類似Process 2504721 got signal: 1的解決方法

之前用nohup來遠程跑LLama factory微調腳本&#xff0c;是沒有問題的&#xff0c;但今天發現運行類似下面這個命令時&#xff0c; nohup llamafactory-cli train examples/train_qlora/qwen_lora.yaml 只要一關閉ssh session&#xff0c;就會終止訓練&#xff0c;報類似&…

python常用內置時間函數+藍橋杯時間真題

1.time 1.1 time.time() 時間戳指&#xff1a;1970年1月1日開始到現在所經過的秒數 import time print(time.time()) # 輸出可得1970年1月1日開始到執行此代碼所經過的秒數 1.2 time.localtime() 返回一個當前時間的時間對象&#xff0c;具體信息&#xff0c;并且可以單獨…

一個用 C 語言打印出所有三位數水仙花數的程序

水仙花數&#xff08;Narcissistic number&#xff09;是指一個三位數&#xff0c;其各位數字的立方和等于該數本身。例如&#xff1a;153 是一個水仙花數&#xff0c;因為 (1^3 5^3 3^3 153)。 以下是一個用 C 語言打印出所有三位數水仙花數的程序&#xff1a; 代碼實現 …

利用 VSCode 配置提升 vibe coding 開發效率

利用 VSCode 配置提升 vibe coding 開發效率 Vibe Coding&#xff08;氛圍編程&#xff09;是一種基于AI的編程方法&#xff0c;其核心在于通過自然語言描述軟件需求&#xff0c;再由大規模語言模型&#xff08;LLM&#xff09;自動生成代碼&#xff0c;從而實現對傳統手寫編程…

練習題:110

目錄 Python題目 題目 題目分析 需求理解 關鍵知識點 實現思路分析 代碼實現 代碼解釋 函數定義&#xff1a; 計算值的總和&#xff1a; 測試函數&#xff1a; 運行思路 結束語 Python題目 題目 定義一個函數&#xff0c;接受一個字典作為參數&#xff0c;返回字…

處理 Linux 信號:進程控制與異常管理的核心

個人主頁&#xff1a;chian-ocean 文章專欄-Linux 前言&#xff1a; 在 Linux 操作系統中&#xff0c;信號是用于進程間通信的一種機制&#xff0c;能夠向進程發送通知&#xff0c;指示某些事件的發生。信號通常由操作系統內核、硬件中斷或其他進程發送。接收和處理信號是 Li…

通信協議之串口

文章目錄 簡介電平標準串口參數及時序USART與UART過程引腳配置 簡介 點對點&#xff0c;只能兩設備通信只需單向的數據傳輸時&#xff0c;可以只接一根通信線當電平標準不一致時&#xff0c;需要加電平轉換芯片&#xff08;一般從控制器出來的是信號是TTL電平&#xff09;地位…

Unity編輯器功能及拓展(1) —特殊的Editor文件夾

Unity中的Editor文件夾是一個具有特殊用途的目錄&#xff0c;主要用于存放與編輯器擴展功能相關的腳本和資源。 一.糾纏不清的UnityEditor 我們Unity中進行游戲構建時&#xff0c;我們經常遇到關于UnityEditor相關命名空間丟失的報錯&#xff0c;這時候&#xff0c;只得將報錯…

工具類-csv文件導入數據庫思路

首先&#xff0c;讓我們來看下數據庫建表語句&#xff1a; CREATE TABLE behavior_reports (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 報告ID,report_type VARCHAR(50) NOT NULL COMMENT 報告類型(daily, weekly, monthly),start_date DATE NOT NULL COMMENT 開始日期,e…

軟件工程之軟件開發模型(瀑布、迭代、敏捷、DevOps)

1. 瀑布模型&#xff08;Waterfall Model&#xff09; 定義與流程 瀑布模型是線性順序的開發流程&#xff0c;包含需求分析、設計、編碼、測試、維護等階段&#xff0c;每個階段完成后才能進入下一階段&#xff0c;類似“瀑布流水”逐級推進。 核心特點 嚴格階段劃分&#…

FreeRTOS與RT-Thread內存分配對比分析

一、動態內存分配策略 ?FreeRTOS ?分配算法多樣性&#xff1a;提供5種動態內存管理算法&#xff08;heap_1至heap_5&#xff09;&#xff0c;覆蓋從簡單到復雜的場景。例如&#xff1a; heap_1&#xff1a;僅支持分配不支持釋放&#xff0c;適用于固定任務棧分配。heap_4&…

202519 | Mybatis-Plus

快速入門 MyBatis-Plus&#xff08;簡稱 MP&#xff09;是 MyBatis 的增強工具&#xff0c;它在 MyBatis 的基礎上只做增強不做改變&#xff0c;簡化了開發&#xff0c;提高了效率。以下是 MyBatis-Plus 的快速入門指南&#xff0c;幫助您快速上手使用。 1. 環境準備 JDK&…