成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不想寫表達式的類型?試試auto吧

開發 后端
你以為我說的自動變量類型auto嗎?非也,我們知道C語言中其實也有auto關鍵字,它和早期C++中的auto關鍵字一樣,它修飾局部變量,表示自動存儲期。

你以為我說的自動變量類型auto嗎?非也,我們知道C語言中其實也有auto關鍵字,它和早期C++中的auto關鍵字一樣,它修飾局部變量,表示自動存儲期,不過由于默認就是這種,因此我們其實常常見不到這樣的寫法:

  1. auto int a =10

本文要介紹的并不是上面的auto,而是C++11中引入的auto關鍵字。

[[283427]]

效果

看看下面的代碼:

  1. #include<iostream>
  2. #include<vector> 
  3. int main() 
  4.     std::vector<int> vec{1,2,3,4,5}; 
  5.     for(std::vector<int>::const_iterator it = vec.begin();it != vec.end();++it) 
  6.     { 
  7.         std::cout<<*it<<std::endl
  8.     } 
  9.     return 0; 

對于it的類型,你自己能快速寫出來嗎?我反正是寫不出來。

再看auto版本:

  1. #include<iostream> 
  2. #include<vector> 
  3. int main() 
  4.     std::vector<int> vec{1,2,3,4,5}; 
  5.     for(auto it = vec.begin();it != vec.end();++it) 
  6.     { 
  7.         std::cout<<*it<<std::endl
  8.     } 
  9.     return 0; 

是不是簡潔了許多?

沒錯,今天就是介紹自動類型推導關鍵字auto。

auto的作用

說實在的,程序員有時候就是“懶”,可能連個表達式的類型都不想寫,auto就是這樣一個關鍵字,它讓編譯器替我們去分析表達式的類型。

當然了,分析的前提是auto定義的變量有初值,如果連值都沒有,怎么可能知道它是什么類型?

auto用法

(1) 普通類型推導

例如:

  1. auto i = 10;//i為int類型 
  2. auto d = 10.2//d 為double類型 
  3. auto f = 10.2f//f為float類型 

(2) const關鍵字修飾的類型推導

通常auto會忽略掉頂層const(本身是常量,如int *cosnt p),而會保留底層const(指向的對象是常量,如const int* p)。

舉個例子頂層const的例子:

  1. const int ci = 10
  2. auto aci = ci;//忽略頂層const,推導ci是int,所以aci類型是int 
  3. const auto ca = ci//推導ci是int,但是前面有const,所以ca是const int 

再說一個底層const的例子:

  1. const int arr[] = {11}; 
  2. auto p = arr;//arr 是const int *,這是底層const,推導后,保留底層const,所以p是 const int* 

arr數組名被當成指針是,是const int*類型,或者說是int const*,它指向的對象是只讀的,因此是底層const,保留,最終p的類型也是int const *。

當然auto還可以設置引用類型,例如:

  1. const int ci = 10
  2. auto &cp = ci;//cp是一個整型常量引 

如果是字面值,則必須加上const:

  1. const auto &ref = 10;//10是字面值,常量引用才能綁定字面值 

想一想

想想下面推導的size類型是什么?

  1. std::vector<int> vec; 
  2. auto size = vec.size(); 

沒錯,它是std::vector::size_type。

要你寫下來你肯定不愿意。

不過下面這樣是沒法推導的奧:

  1. vector<string> aa; 
  2.    //vector<string> bb = aa;//無法推導出模板類型 

下面這段程序幫你查看真正類型的名稱,僅供參考:

  1. #include <iostream>
  2. #include <vector> 
  3. #include <cxxabi.h> 
  4. #include <typeinfo> 
  5. int main() 
  6.     int     status; 
  7.     char   *realname; 
  8.     auto type = 1.1; 
  9.     realname = abi::__cxa_demangle(typeid(type).name(), 0, 0, &status); 
  10.     std::cout << typeid(type).name() << " => " << realname <<std::endl
  11.     free(realname); 
  12.     return 0; 

輸出結果:

  1. double 

總結

乍一看,好像挺簡單的那么一回事,不過使用auto最好注意類型推導規則,不是很明確的規則不建議以代碼可讀性為代價而簡化代碼。

當然了,它也有以下特點:

  • 可能使得代碼可讀性差
  • 某些情況auto得到的類型可能不是你想要的

因此一定要合理使用。

 

責任編輯:趙寧寧 來源: 編程珠璣
相關推薦

2022-03-28 06:19:14

正則表達式開發

2021-11-10 09:45:06

Lambda表達式語言

2014-01-05 17:41:09

PostgreSQL表達式

2024-03-25 13:46:12

C#Lambda編程

2018-09-27 15:25:08

正則表達式前端

2021-01-07 10:15:55

開發 Java開源

2012-06-26 10:03:58

JavaJava 8lambda

2017-09-06 15:15:48

Python正則表達式

2009-09-09 13:01:33

LINQ Lambda

2009-09-11 12:32:33

LINQ表達式

2009-09-15 15:18:00

Linq Lambda

2011-10-28 16:34:13

LINQ

2009-07-03 18:31:04

JSP表達式

2009-09-10 15:35:07

LINQ查詢表達式

2022-12-05 09:31:51

接口lambda表達式

2020-09-04 09:16:04

Python正則表達式虛擬機

2009-09-09 17:45:07

Linq表達式

2009-09-11 09:48:27

Linq Lambda

2009-09-17 14:21:19

LINQ表達式

2009-08-07 14:24:31

.NET正則表達式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.操.com| 国产激情视频在线观看 | cao在线| 日本在线综合 | 中文字幕国产一区 | 精品久久久久久久久久久久久久 | 天天爽夜夜爽精品视频婷婷 | 精品成人在线视频 | 欧美bondage紧缚视频 | 亚洲一区 中文字幕 | 国产精品一区二区久久精品爱微奶 | 黄色国产视频 | 一二区视频| 免费观看www7722午夜电影 | 91私密视频 | 欧美成人久久 | 福利一区在线观看 | 国产欧美日韩一区二区三区在线观看 | 成人在线视频网站 | 亚洲精品中文字幕在线 | 国产黄色在线观看 | 国产精品久久久久久久久久久久久 | 亚洲人成在线播放 | 国产高清精品在线 | 国产日韩一区二区 | 国产免费视频 | 亚洲人人舔人人 | 亚洲视频一区二区三区 | 91在线视频免费观看 | 亚洲激情av| 亚洲一区二区三区四区五区午夜 | 免费观看一级毛片 | 中文字幕视频一区 | 欧美日一区二区 | 精品久久久久久中文字幕 | japanhdxxxx裸体| 2020亚洲天堂 | 秋霞电影院午夜伦 | 亚洲精品欧美 | 男女午夜激情视频 | 精品视频一区二区三区在线观看 |