【C++ grammar】Enhancement for Type System (C++11 對類型系統的增強)

數據類型 (Data type)

int, long int, double, struct, char *, float [], int (*f)()…

計算機程序構造塊

計算機程序構造塊是不同大小粒度的計算機程序組成部分,它包括變量、表達式、函數或者模塊等。

類型系統 (Type System)

類型系統:在編程語言中,“類型系統”是將“type”屬性指定給不同計算機程序構造塊的規則集
為什么使用類型系統:減少程序中可能出現的bug
1、定義不同程序塊之間的接口
2、檢查多個塊之間是否以一致的方式連接在一起
類型系統分為:靜態類型和動態類型
類型系統存在于我們編寫程序中,編譯器會幫我們檢查類型系統。
如果檢查發生在編譯期(編譯的時候檢查類型系統是否一致),稱為靜態類型
如果檢查發生在運行期(執行的時候檢查類型系統是否一致),稱為動態類型
如果檢查同時存在與編譯期間和運行期間,稱為混合類型
C、C++、Java是靜態類型
Python是動態類型
在這里插入圖片描述

Automatic Type Deduction: auto (C++11) 自動類型推導:auto關鍵字

C++03及之前的標準種,auto放在變量聲明之前,聲明變量的存儲策略。但是這個關鍵字常省略不寫。
C++11中,auto關鍵字放在變量之前,作用是在聲明變量的時候根據變量初始值的類型自動為此變量選擇匹配的類型
例:

int a = 10;
auto au_a = a;//自動類型推斷,au_a為int類型 
cout << typeid(au_a).name() << endl;

result:

int

注意點:
1、auto 變量必須在定義時初始化,這類似于const關鍵字

auto a1 = 10;  //正確 
auto b1;   //錯誤,編譯器無法推導b1的類型
b1 = 10;

2、定義在一個auto序列的變量必須始終推導成同一類型

auto a4 = 10, a5{20};   //正確 
auto b4{10}, b5 = 20.0; //錯誤,沒有推導為同一類型

3、如果初始化表達式是引用或const,則去除引用或const語義。

int a{10}; int &b = a;
auto c = b;   //c的類型為int而非int&(去除引用)
const int a1{10};
auto b1 = a1; //b1的類型為int而非const int(去除const) 

4、如果auto關鍵字帶上&號,則不去除引用或const語意

int a = 10; int& b = a;
auto& d = b;//此時d的類型才為int&
const int a2 = 10;
auto& b2 = a2;//因為auto帶上&,故不去除const,b2類型為const in

5、初始化表達式為數組時,auto關鍵字推導類型為指針

int a3[3] = { 1, 2, 3 };
auto b3 = a3;
cout << typeid(b3).name() << endl; //輸出int * (輸出與編譯器有關)

6、若表達式為數組且auto帶上&,則推導類型為數組類型

int a7[3] = { 1, 2, 3 };
auto& b7 = a7;
cout << typeid(b7).name() << endl; //輸出int [3] (輸出與編譯器有關)

7、C++14中,auto可以作為函數的返回值類型和參數類型

auto max(int x , int y)
{return x>y?x:y;
}

我們在使用auto時有時會遇到一些特殊情況。

1、 “int x = 3;” 能變成auto形式嗎?
當我們非常希望能夠在變量定義的時候,【明確】地指出變量的類型,而且不希望隨便更改其類型,那么我們可以使用下面的方法:

auto x = int {3};  // 初始化列表auto y = int {3.0}; // 編譯器報錯,初始化列表不能窄化auto z = int (3.0);  // C風格的強制類型轉換,z的值是整數3

2、 auto和初始化列表一起用 要避免在一行中使用直接列表初始化和拷貝列表初始化,也就是,下面的代碼是有問題的:

auto x { 1 }, y = { 2 };  // 不要同時使用直接和拷貝列表初始化

在這里插入圖片描述
“AAA原則”:總是使用auto!
問題:能用auto聲明C風格的數組嗎?
如果你嘗試讓C++11編譯器編譯如下代碼,它會報錯

// 包含頭文件
// 聲明主函數
// ......
auto x[] = {1,2,3};

auto 不能用于聲明數組,否則無法通過編譯,報auto類型不能出現在頂級數組類型中。
也就是說auto只能是指針指向數組的而不能去聲明一個數組。

自動類型推導:decltype關鍵字

1、關鍵字decltype的用法
decltype利用已知類型聲明新變量。
有了auto,為什么還要整出一個decltype?原因是,我們有時候想要從表達式的類型推斷出要定義的變量類型,但不想用該表達式的值初始化變量。
decltype是在編譯期推導一個表達式的類型,而不用初始化,其語法格式有點像sizeof。它只做靜態分析,因此它不會導致已知類型表達式執行。
decltype 主要用于泛型編程(模板)
2、代碼示例

#include<iostream>
using namespace std;
int  fun1()  { return 10;  }
auto fun2()  { return 'g'; }  // C++14
int main(){// Data type of x is same as return type of fun1()// and type of y is same as return type of fun2()decltype(fun1()) x;  // 不會執行fun1()函數,相當于 int x;decltype(fun2()) y = fun2();		//auto y=>char y;cout << typeid(x).name() << endl;cout << typeid(y).name() << endl;return 0;
}

我們可以發現,我們將fun2的‘g’改變,例如改成4,y類型也改了。
這樣我們修改了返回值類型,程序仍然能夠正常運行。
這說明,使用類型推導是有好處的。
3、decltype與auto的對比
decltype和auto都是C++11自動類型推導的關鍵字。它們有很多差別:
auto忽略最上層的const,decltype則保留最上層的const
auto忽略原有類型的引用,decltype則保留原有類型的引用
對解引用操作,auto推斷出原有類型,decltype推斷出引用

4、auto推斷時會實際執行,decltype不會執行,只做分析。
總之在使用中過程中和const、引用和指針結合時需要特別小心。

小結

C++11對C++03的增強,或者說C++11的“Modern”的特點之一就是由auto和decltype構成的自動類型推導系統。

但是,auto與初始化列表結合,又有一些坑。你在寫代碼時如果經常將auto與列表初始化一起使用,那么會遇到一些問題。本節只介紹auto的常見用法。auto與初始化列表結合的坑,得由你自己去踩了。

為了說明auto有多么復雜,這里摘取 https://cppreference.com 網站列出的auto的語法格式:
在這里插入圖片描述

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

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

相關文章

.net romoting 的EventWrapper類

.net romoting 的EventWrapper類 注意&#xff1a;防火墻的問題 --------------------------------------------------- //定義廣播服務接口 [Serializable] public delegate void BroadCastEventHandler(string info); public interface IBroadCastService {…

一、織物組織相關基本概念

一、織物形成的五大運動&#xff1a;開口、引緯、打緯、送經、卷取 開口運動&#xff08;先開口讓織物形成上下兩層&#xff09; 引緯運動&#xff08;在上下兩層經紗之間進行引緯&#xff0c;把緯紗穿入上下兩層經紗之間&#xff0c;從而實現經紗緯紗之間的交織&#xff09; …

達爾豪斯大學計算機科學世界排名,達爾豪斯大學成了全加最好,這又是個什么排名?...

原標題&#xff1a;達爾豪斯大學成了全加最好&#xff0c;這又是個什么排名&#xff1f;沒有“八大”的知名&#xff0c;沒有“常春藤”的受寵&#xff0c;雖然它只是眾多名校中的普通一個&#xff0c;但只要你對它有個稍微的了解&#xff0c;你一定會愛上它的&#xff01;它雖…

tag標簽記錄

看到項目代碼中有一個自定義的tag標簽&#xff0c;想起以前自己寫過的標簽&#xff0c;竟然忘記的差不多了&#xff0c;手一癢&#xff0c;自己寫個簡單的tag標簽&#xff0c;回顧一下歷史知識 首先建一個servlet工程&#xff0c;然后寫個index.jsp&#xff0c;項目跑起來&…

java類只讀怎么辦_如何在Java中制作一個只讀類?

java類只讀怎么辦The question is that "can we make a read-only class in Java?" 問題是“我們可以用Java制作一個只讀類嗎&#xff1f;” The answer is: "Yes, we can make a read-only in java." 答案是&#xff1a; “是的&#xff0c;我們可以在J…

LeetCode 53:最大子序和解題以及優化思路(第一次獨立刷題記錄)

給定一個整數數組 nums &#xff0c;找到一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4] 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大&#xff0c;為 6。 進階: 如果你已經實現…

NHibernate 的 ID 標識選擇器

在 Hibernate 中&#xff0c;每個對象需要一個標識 ID&#xff0c;通過這個標識 ID 建立對象與數據庫中記錄的對應關系。 Nhibernate 提供了多種方式來建立這個 POID。基于不同的生成策略&#xff0c;可以選擇更佳的方式。 首先是賦值方式&#xff1a;assigned&#xff0c;這種…

三、規則組織的衍生組織——經山形組織數學模型的建立

基礎概念公式推到可參考該專欄下的前幾篇博文。 經山形組織圖&#xff1a; 左半部分&#xff1a;&#xff0c;3上2下1上2下&#xff0c;右斜&#xff0c;飛數為1 右半部分&#xff1a;&#xff0c;3上2下1上2下&#xff0c;左斜&#xff0c;飛數為-1 左右兩部分只有飛數是相…

c語言 函數的參數傳遞示例_scalbln()函數以及C ++中的示例

c語言 函數的參數傳遞示例C scalbln()函數 (C scalbln() function) scalbln() function is a library function of cmath header. It scales the significand using floating-point base exponent (long int) i.e. it is used to calculate the product of the given signific…

上周熱點回顧(7.8-7.14)

熱點隨筆&#xff1a; MingQQ v1.0高仿版開源了&#xff0c;使用WebQQ協議實現了QQ客戶端基本的聊天功能...&#xff08;ZYM&#xff09; 我的新書&#xff0d;&#xff0d;《從員工到經理人》&#xff08;Jimmy Zhang&#xff09; MVC實用架構設計&#xff08;三&#xff0…

儲存過程生成器

/Files/qanholas/SPGen_ReleaseCandidate1_Binaries.zip ---- Dropping stored procedure sp_費用表_SelectAll : --IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id OBJECT_ID(N[sp_費用表_SelectAll]) AND OBJECTPROPERTY(id, NIsProcedure) 1)DROP PROCEDURE [dbo].[sp…

基于計算機控制的溫度檢測系統,基于專用溫度傳感的溫度檢測系統.doc

基于專用溫度傳感的溫度檢測系統摘 要 在現代工業領域溫度檢測系統是指用某種方式顯示出當前的環境溫度。傳統使用PTC或NTC電阻作為溫度傳感器的方式在使用過程中存在著很多不足之處比如所采集溫度的精度比較低、系統的可靠性差、設計難度較大、整體設計成本較高等缺點已…

LeetCode 121:買賣股票的最佳時機 思考分析

題目描述&#xff1a; 給定一個數組&#xff0c;它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多只允許完成一筆交易&#xff08;即買入和賣出一支股票一次&#xff09;&#xff0c;設計一個算法來計算你所能獲取的最大利潤。 注意&#xff1a;你不能在買入股票前賣出…

四、規則組織的衍生組織——經向破斜組織數學模型的建立

基礎概念公式推到可參考該專欄下的前幾篇博文。 經向破斜組織圖&#xff1a; 左半部分&#xff1a;&#xff0c;3上2下1上2下&#xff0c;右斜&#xff0c;飛數為1 右半部分&#xff1a;&#xff0c;2上1下2上3下。左斜&#xff0c;飛數為-1 左右兩部分&#xff0c;經緯紗組織…

EASYUI+MVC4通用權限管理平臺

通用權限案例平臺在經過幾年的實際項目使用&#xff0c;并取得了不錯的用戶好評。在平臺開發完成后&#xff0c;特抽空總結一下平臺知識&#xff0c;請各位在以后的時間里&#xff0c;關注博客的更新。 1.EASYUIMVC4通用權限管理平臺--前言 2.通用權限管理平臺--架構選型 3.通用…

int max+1小于0_INT_MAX常數,C ++中的示例

int max1小于0C INT_MAX宏常量 (C INT_MAX macro constant) INT_MAX constant is a macro constant which is defied in climits header, it is used to get the maximum value of a signed int object, it returns the maximum value that a signed int object can store, wh…

在計算機領域客觀事物的屬性表示為數據,數據與信息試題解析

一圖看懂數據與信息1、在計算機領域&#xff0c;信息是經過轉化而成為計算機能夠處理的__________。A&#xff0e;數據B&#xff0e;符號C&#xff0e;圖形D&#xff0e;數字答案&#xff1a;A。解析&#xff1a;本題考查有關信息基本概念的知識。信息是人們由客觀事物得到的。…

Mysql Data 目錄和 Binlog 目錄 搬遷

Mysql5.1.38 Data 目錄和 Binlog 目錄 搬遷 [mysql-bin.index not found (Errcode: 2)]Leave a comment Go to comments剛開始安裝時使用了默認目錄&#xff0c;使用一段時間&#xff0c;數據慢慢變在&#xff0c;發現當前設置的目錄空間不夠時&#xff0c;就要搬遷數據到另一個…

【數據結構基礎】【散列表】

散列表也叫做哈希表(hash table),這種數據結構提供了鍵(key)和值(value)的映射關系。只要給出一個key&#xff0c;就可以高效查找它匹配的value&#xff0c;時間復雜度接近O(1); 哈希函數 哈希函數通過某種方式&#xff0c;把key和數組下標進行轉換。 在java中&#xff0c;每…

VisualStudio運行C++項目檢測include<stdio.h>報錯解決方案

一、項目—>屬性 二、將SDL檢查更改為否即可