最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解C++11中auto的使用

 更新時(shí)間:2023年07月02日 16:31:25   作者:fengbingchun  
這篇文章主要為大家分享一下C++11中auto關(guān)鍵字的使用示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

在C語(yǔ)言中,就有了auto關(guān)鍵字,它被當(dāng)作是一個(gè)變量的存儲(chǔ)類(lèi)型修飾符,表示自動(dòng)變量(局部變量)。它不能被單獨(dú)使用,否則編譯器會(huì)給出警告。在C++11標(biāo)準(zhǔn)中,添加了新的類(lèi)型推導(dǎo)特性。在C ++11中,使用auto定義的變量不能使用其它類(lèi)型修飾符修飾,該變量的類(lèi)型由編譯器根據(jù)初始化數(shù)據(jù)自動(dòng)確定。

C++中類(lèi)型檢查是在編譯階段。動(dòng)態(tài)類(lèi)型語(yǔ)言能做到在運(yùn)行時(shí)決定類(lèi)型,主要?dú)w功于一技術(shù),這技術(shù)是類(lèi)型推導(dǎo)。在C++11中,可以通過(guò)重定義auto關(guān)鍵字來(lái)實(shí)現(xiàn)類(lèi)型推導(dǎo)。

在C++11中,使用auto關(guān)鍵字可以要求編譯器對(duì)變量的類(lèi)型進(jìn)行自動(dòng)推導(dǎo)。

auto關(guān)鍵字:類(lèi)型推導(dǎo),從該關(guān)鍵字的初始化表達(dá)式中推導(dǎo)變量的類(lèi)型。

在塊作用域、命名空間作用域、for循環(huán)的初始化語(yǔ)句內(nèi)聲明變量的時(shí)候,變量的類(lèi)型可以被省略,使用關(guān)鍵字auto來(lái)代替。

auto聲明的變量必須被初始化,以使編譯器能夠從其初始化表達(dá)式中推導(dǎo)出其類(lèi)型。

聲明為auto的變量在編譯時(shí)期就分配了內(nèi)存,而不是到了運(yùn)行時(shí)期,所以使用auto不再引發(fā)任何速度延遲,這也意味著使用auto的時(shí)候,這個(gè)變量不初始化會(huì)報(bào)錯(cuò),因?yàn)榫幾g器無(wú)法知道這個(gè)變量的類(lèi)型。

auto使用時(shí)需注意:

(1)、可以使用const、volatile、pointer(*)、reference(&)、rvalue reference(&&)等說(shuō)明符和聲明符來(lái)修飾auto關(guān)鍵字;

(2)、用auto聲明的變量必須初始化;

(3)、auto不能與其它任何類(lèi)型說(shuō)明符一起使用;

(4)、方法、參數(shù)或模板參數(shù)不能被聲明為auto;

(5)、定義在堆上的變量,使用了auto的表達(dá)式必須被初始化;

(6)、auto是一個(gè)占位符,不是類(lèi)型,不能用于類(lèi)型轉(zhuǎn)換或其它一些操作,如sizeof、typeid;

(7)、auto關(guān)鍵字內(nèi)聲明的聲明符列表的所有符號(hào)必須解析為同一類(lèi)型;

(8)、auto不能自動(dòng)推導(dǎo)成CV-qualifiers(constant& volatile qualifiers),除非被聲明為引用類(lèi)型;

(9)、auto會(huì)退化成指向數(shù)組的指針,除非被聲明為引用;

(10)、auto不能作為函數(shù)的返回類(lèi)型,在C++14中是可以的。

建議:大多數(shù)情況使用關(guān)鍵字auto,除非非常需要轉(zhuǎn)換。

下面是從其他文章中copy的測(cè)試代碼,詳細(xì)內(nèi)容介紹可以參考對(duì)應(yīng)的reference:

#include "auto.hpp"
#include <iostream>
#include <cmath>
#include <typeinfo>
#include <string>
#include <map>
#include <list>
#include <deque>
#include <vector>
//
// reference: http://en.cppreference.com/w/cpp/language/auto
template<class T, class U>
auto add(T t, U u) -> decltype(t + u) // the return type is the type of operator+(T, U)
{
	return t + u;
}
auto get_fun(int arg) -> double(*)(double) // same as: double (*get_fun(int))(double)
{
	switch (arg) {
		case 1: return std::fabs;
		case 2: return std::sin;
		default: return std::cos;
	}
}
int test_auto1()
{
	auto a = 1 + 2;
	std::cout << "type of a: " << typeid(a).name() << '\n'; // type of a: int
	auto b = add(1, 1.2);
	std::cout << "type of b: " << typeid(b).name() << '\n'; // type of b: double
	auto c = { 1, 2 };
	std::cout << "type of c: " << typeid(c).name() << '\n'; // type of c: class std::initializer_list<int>
	auto my_lambda = [](int x) { return x + 3; };
	std::cout << "my_lambda: " << my_lambda(5) << '\n'; // my_lambda: 8
	auto my_fun = get_fun(2);
	std::cout << "type of my_fun: " << typeid(my_fun).name() << '\n'; // type of my_fun: double (__cdecl*)(double)
	std::cout << "my_fun: " << my_fun(3) << '\n'; // my_fun: 0.14112
	// auto int x; // error as of C++11: "auto" is no longer a storage-class specifier // error C3530: “auto”不能與任何其他類(lèi)型說(shuō)明符組合
	return 0;
}
// reference: https://msdn.microsoft.com/zh-cn/library/dd293667(v=vs.120).aspx
int f(int x) { return x; }
int test_auto2()
{
	int count = 10;
	int& countRef = count;
	auto myAuto = countRef;
	countRef = 11;
	std::cout << count << " " << std::endl; // 11
	myAuto = 12;
	std::cout << count << std::endl; // 11
	// 1. 下面的聲明等效。 在第一個(gè)語(yǔ)句中,聲明 j 變量為類(lèi)型 int。 在第二個(gè)語(yǔ)句,因?yàn)槌跏蓟磉_(dá)式 (0) 是整數(shù),所以變量 k 推導(dǎo)為 int 類(lèi)型
	int j = 0;  // Variable j is explicitly type int.
	auto k = 0; // Variable k is implicitly type int because 0 is an integer.
	// 2. 以下聲明等效,但第二個(gè)聲明比第一個(gè)簡(jiǎn)單
	std::map<int, std::list<std::string>> m;
	std::map<int, std::list<std::string>>::iterator i = m.begin();
	auto i_ = m.begin();
	// 3. 聲明 iter 和 elem 變量類(lèi)型
	std::deque<double> dqDoubleData(10, 0.1);
	for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter) { /* ... */}
	// prefer range-for loops with the following information in mind
	// (this applies to any range-for with auto, not just deque)
	for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples 
	{ /* ... */ }
	for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
	{ /* ... */ }
	for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
	{ /* ... */ }
	// 4. 使用 new 運(yùn)算符
	double x = 12.34;
	auto *y = new auto(x), **z = new auto(&x);
	// 5. 所有符號(hào)解析為同一類(lèi)型
	auto x_ = 1, *y_ = &x_, **z_ = &y_; // Resolves to int.
	auto a(2.01), *b(&a);         // Resolves to double.
	auto c = 'a', *d(&c);          // Resolves to char.
	auto m_ = 1, &n_ = m_;            // Resolves to int.
	// 6. 使用條件運(yùn)算符 (?:)
	int v1 = 100, v2 = 200;
	auto e = v1 > v2 ? v1 : v2;
	// 7. 將變量 x7 初始化類(lèi)型 int,將引用的變量 y7 初始化為類(lèi)型 const int,及將變量 fp 初始化為指向返回類(lèi)型 int 的函數(shù)的指針
	auto x7 = f(0);
	const auto & y7 = f(1);
	int(*p)(int x7);
	p = f;
	auto fp = p;
	return 0;
}
/
// reference: http://www.learncpp.com/cpp-tutorial/4-8-the-auto-keyword/
int add_3(int x, int y)
{
	return x + y;
}
int test_auto3()
{
	auto d = 5.0; // 5.0 is a double literal, so d will be type double
	auto i = 1 + 2; // 1 + 2 evaluates to an integer, so i will be type int
	auto sum = add_3(5, 6); // add_3() returns an int, so sum will be type int
	return 0;
}

GitHubhttps://github.com/fengbingchun/Messy_Test

到此這篇關(guān)于一文詳解C++11中auto的使用的文章就介紹到這了,更多相關(guān)C++11 auto內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VC程序在Win32環(huán)境下動(dòng)態(tài)鏈接庫(kù)(DLL)編程原理

    VC程序在Win32環(huán)境下動(dòng)態(tài)鏈接庫(kù)(DLL)編程原理

    這篇文章主要介紹了VC程序在Win32環(huán)境下動(dòng)態(tài)鏈接庫(kù)(DLL)編程原理,包括了dll文件的原理與具體實(shí)現(xiàn)過(guò)程,對(duì)于深入掌握VC程序設(shè)計(jì)具有很好的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++中delete指針后最好將其置空的操作方法

    C++中delete指針后最好將其置空的操作方法

    C++編程中,當(dāng)你使用delete運(yùn)算符釋放指針?biāo)赶虻膬?nèi)存后,通常將該指針置空,如果一個(gè)指針在被刪除后沒(méi)有置空,而你在代碼的其他部分再次嘗試刪除同一個(gè)指針,可能會(huì)導(dǎo)致程序崩潰或產(chǎn)生未定義行為,本文介紹C++中delete指針后最好將其置空的操作方法,感興趣的朋友一起看看吧
    2024-06-06
  • C++實(shí)現(xiàn)模擬shell命令行(代碼解析)

    C++實(shí)現(xiàn)模擬shell命令行(代碼解析)

    這篇文章主要介紹了C++實(shí)現(xiàn)模擬shell命令行,本文通過(guò)實(shí)例代碼進(jìn)行命令行解析,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C/C++ Windows SAPI實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能

    C/C++ Windows SAPI實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能

    本文通過(guò)封裝Windows SAPI(Speech Application Programming Interface),提供了一個(gè)現(xiàn)代化的C++接口實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能,這篇文章重點(diǎn)給大家介紹C/C++ Windows SAPI自實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能,感興趣的朋友一起看看吧
    2025-02-02
  • C++編寫(xiě)DLL動(dòng)態(tài)鏈接庫(kù)的步驟與實(shí)現(xiàn)方法

    C++編寫(xiě)DLL動(dòng)態(tài)鏈接庫(kù)的步驟與實(shí)現(xiàn)方法

    這篇文章主要介紹了C++編寫(xiě)DLL動(dòng)態(tài)鏈接庫(kù)的步驟與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了C++導(dǎo)出類(lèi)文件及生成與調(diào)用DLL動(dòng)態(tài)連接庫(kù)的相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08
  • Qt實(shí)現(xiàn)刪除布局與布局切換功能

    Qt實(shí)現(xiàn)刪除布局與布局切換功能

    在Qt應(yīng)用開(kāi)發(fā)中,動(dòng)態(tài)管理布局是一個(gè)常見(jiàn)需求,比如根據(jù)用戶(hù)操作動(dòng)態(tài)刪除某個(gè)布局,或在不同布局間進(jìn)行切換,本文將詳細(xì)介紹如何實(shí)現(xiàn)這些功能,并通過(guò)完整示例展示具體操作,需要的朋友可以參考下
    2025-11-11
  • Matlab實(shí)現(xiàn)獲取文件夾下所有指定后綴的文件

    Matlab實(shí)現(xiàn)獲取文件夾下所有指定后綴的文件

    這篇文章主要為大家詳細(xì)介紹了Matlab如何獲取文件夾下所有指定后綴的文件(包含子文件夾),文中的示例代碼講解詳細(xì),感興趣的可以嘗試一下
    2022-11-11
  • C語(yǔ)言中位域的使用詳解

    C語(yǔ)言中位域的使用詳解

    位域是C語(yǔ)言中的一種高級(jí)功能,允許程序員為結(jié)構(gòu)體的成員分配特定數(shù)量的位,本文主要為大家介紹了位域的使用以及優(yōu)缺點(diǎn),希望對(duì)大家有所幫助
    2023-07-07
  • 一文詳解C++關(guān)鍵字nullptr及與NULL的區(qū)別

    一文詳解C++關(guān)鍵字nullptr及與NULL的區(qū)別

    這篇文章主要給大家詳細(xì)介紹了C++關(guān)鍵字nullptr,及?NULL與nullptr的區(qū)別,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 必須知道的C語(yǔ)言八大排序算法(收藏)

    必須知道的C語(yǔ)言八大排序算法(收藏)

    這篇文章主要介紹了C語(yǔ)言八大排序算法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-10-10

最新評(píng)論

佛教| 洛宁县| 麻栗坡县| 区。| 舒城县| 浦江县| 宝应县| 资中县| 怀仁县| 新巴尔虎左旗| 大英县| 印江| 阳城县| 涞源县| 乌兰县| 耿马| 四平市| 桦南县| 乌拉特前旗| 梁平县| 澄迈县| 鹿邑县| 喀喇沁旗| 沙河市| 保定市| 阿勒泰市| 名山县| 满洲里市| 罗甸县| 土默特左旗| 陵川县| 进贤县| 陆丰市| 汾阳市| 泸定县| 萨迦县| 杭锦旗| 阜平县| 石景山区| 青神县| 南溪县|