日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ auto用法_不想写表达式的类型?试试auto吧

發布時間:2025/3/15 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ auto用法_不想写表达式的类型?试试auto吧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:守望,Linux應用開發者,目前在公眾號【編程珠璣】?分享Linux/C/C++/數據結構與算法/工具等原創技術文章和學習資源。

前言

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

auto?int?a?=10;

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

效果

看看下面的代碼:

#include//來源:公眾號【編程珠璣】
#include
int?main(){
????std::vector<int>?vec{1,2,3,4,5};
????for(std::vector<int>::const_iterator?it?=?vec.begin();it?!=?vec.end();++it)
????{
????????std::cout<std::endl;
????}
????return?0;
}

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

再看auto版本:

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

是不是簡潔了許多?

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

auto的作用

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

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

auto用法

普通類型推導

例如:

auto?i?=?10;//i為int類型
auto?d?=?10.2//d?為double類型
auto?f?=?10.2f//f為float類型

const關鍵字修飾的類型推導

通常auto會忽略掉頂層const(本身是常量,如int *cosnt p),而會保留底層const(指向的對象是常量,如const int* p)。關于const的更多內容可以參考《C++與C中的const關鍵字有何差別?》舉個例子頂層const的例子:

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

再說一個底層const的例子:

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

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

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

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

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

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

想一想

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

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

沒錯,它是std::vector::size_type。要你寫下來你肯定不愿意。

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

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

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

#include?//編程珠璣
#include?
#include?
#include?
int?main(){
????int?????status;
????char???*realname;
????auto?type?=?1.1;
????realname?=?abi::__cxa_demangle(typeid(type).name(),?0,?0,?&status);
????std::cout?<typeid(type).name()?<"?=>?"?<std::endl;
????free(realname);
????return?0;
}

輸出結果:

double

總結

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

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

  • 可能使得代碼可讀性差

  • 某些情況auto得到的類型可能不是你想要的

因此一定要合理使用。


●編號611,輸入編號直達本文

●輸入m獲取文章目錄

C語言與C++編程

分享C/C++技術文章

總結

以上是生活随笔為你收集整理的c++ auto用法_不想写表达式的类型?试试auto吧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。