欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++?auto關鍵字的小知識點分享

 更新時間:2023年05月24日 09:03:40   作者:云小逸  
這篇文章主要是來和大家介紹一些C++中的小知識點,本文將從auto關鍵字開始講起,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下

前言

今天我們學習一些關于C++的一些小知識點,碼字不易,希望多多支持

auto關鍵字(C++11)

1.類型別名思考

隨著程序越來越復雜,程序中用到的類型也越來越復雜,經常體現在:

  • 類型難于拼寫
  • 含義不明確導致容易出錯

就比如下面這段代碼:

#include <string>
#include <map>
int main()
{
	std::map<std::string, std::string> m{ { "apple", "蘋果" }, { "orange",
   "橙子" },
	  {"pear","梨"} };
	std::map<std::string, std::string>::iterator it = m.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

std::map<std::string, std::string>::iterator是一個類型,但是該類型太長了,特別容易寫錯。聰明的同學可能已經想到:可以通過typedef給類型取別名,比如:

使用typedef取別名

#include <string>
#include <map>
typedef std::map<std::string, std::string> Map;
int main()
{
	Map m{ { "apple", "蘋果" },{ "orange", "橙子" }, {"pear","梨"} };
	Map::iterator it = m.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

但是:使用typedef給類型取別名確實可以簡化代碼,但是typedef有會遇到新的難題:

使用typedef來為類型取別名可以提高代碼的可讀性和可維護性,但在某些情況下,過度使用或不恰當使用typedef可能會導致代碼變得復雜、難以理解或難以調試。以下是一個關于使用typedef取類型別名的不好之處的例子:

typedef int* IntPtr;
void foo(IntPtr ptr) {
    // 一些代碼邏輯
}
int main() {
    int num = 5;
    IntPtr ptr = &num;
    foo(ptr);
    return 0;
}

在上述示例中,typedef被用于將int*類型定義為IntPtr類型的別名。然而,這種命名方式可能會產生誤導,讓人誤以為IntPtr是一個指向整型的指針,而不是一個整型指針。這種混淆可能導致代碼閱讀和調試時的困惑。

此外,使用typedef的過度使用可能導致代碼中出現大量的類型別名,使得代碼變得難以理解。例如,當存在多個具有不同功能的指針類型時,使用過多的typedef可能會使代碼變得混亂,增加了理解和維護的難度。

綜上所述,不當或過度使用typedef可能會使代碼變得復雜,難以理解和難以調試,從而影響代碼的可讀性和可維護性。因此,在使用typedef時需要慎重考慮,并確保起到提高代碼可讀性的作用,而不是增加代碼的復雜性。

2.auto簡介

1.在早期C/C++中auto的含義是:使用 auto修飾的變量,是具有自動存儲器的局部變量 ,但遺憾的是一直沒有人去使用它,大家可思考下為什么?

2.C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。 舉例:

#include<iostream>
using namespace std;
int TestAuto()
{
	return 10;
}
int main()
{
	int a = 10;
	auto b = a;
	auto c = 'a';
	auto d = TestAuto();
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	//auto e; 無法通過編譯,使用auto定義變量時必須對其進行初始化
	return 0;
}

注意

使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為變量實際的類型。

3.auto的使用細則

auto與指針和引用結合起來使用

用auto聲明指針類型時,用auto和auto沒有任何區(qū)別,但用auto聲明引用類型時則必須加&

#include<iostream>
using namespace std;
int main()
{
    int x = 10;
    auto a = &x;
    auto* b = &x;
    auto& c = x;
    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    *a = 20;
    *b = 30;
    c = 40;
    return 0;
}

在同一行定義多個變量

當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進行推導,然后用推導出來的類型定義其他變量 。

void TestAuto()
{
    auto a = 1, b = 2; 
    auto c = 3, d = 4.0;  // 該行代碼會編譯失敗,因為c和d的初始化表達式類型不同
}

4.auto不能推導的場景

auto不能作為函數的參數

// 此處代碼編譯失敗,auto不能作為形參類型,因為編譯器無法對a的實際類型進行推導
void TestAuto(auto a)
{}

auto不能直接用來聲明數組

void TestAuto()
{
    int a[] = {1,2,3};
    auto b[] = {4,5,6};
}

為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法

auto在實際中最常見的優(yōu)勢用法就是跟以后會講到的C++11提供的新式為循環(huán),還有l(wèi)ambda表達式等進行配合使用。

注意事項

到此這篇關于C++ auto關鍵字的小知識點分享的文章就介紹到這了,更多相關C++ auto關鍵字內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++用boost.signal實現多播委托

    C++用boost.signal實現多播委托

    這篇文章介紹了C++用boost.signal實現多播委托的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C語言內存函數的具體使用

    C語言內存函數的具體使用

    本文介紹了C語言中幾個常用的內存函數,包括memcpy、memmove、memset、memcmp的使用方法及其模擬實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • C語言詳細分析講解struct與union使用方法

    C語言詳細分析講解struct與union使用方法

    最近開始自學C語言,從最基礎部分的開始學起。今天看書的時候注意到了struct和union似乎很像,除了名字不同,看起來幾乎沒有區(qū)別。<BR>既然C中定義了struct和union兩個關鍵字,那么它們肯定是有區(qū)別的,在查了一些資料之后我來總結一下他們的使用
    2022-04-04
  • C++ STL中的容器適配器實現

    C++ STL中的容器適配器實現

    這篇文章主要介紹了C++ STL中的容器適配器實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C語言:變量的作用域和生命周期詳解

    C語言:變量的作用域和生命周期詳解

    這篇文章主要介紹了C++作用域與生命周期的相關資料,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-08-08
  • C++結構體中變長數組的使用問題分解刨析

    C++結構體中變長數組的使用問題分解刨析

    變長數組在C++中指的是集合(也叫容器)如vector就是C語言中,所有的數組都不定長,沒有下標越界的概念,數組實質就是一個指針(由數組名充當)因此C語言中數組的長度沒有任何意義平常在C語言中講的不定長數組,其實就是指針
    2022-08-08
  • C++詳細講解常用math函數的用法

    C++詳細講解常用math函數的用法

    C++提供了很多實用的數學函數,如果要使用先添加頭文件,當然,加頭文件誰都知道,接下來我們一起詳細看看各個math函數的實際使用
    2022-04-04
  • C++ vector如何動態(tài)申請內存的元素

    C++ vector如何動態(tài)申請內存的元素

    vector是一種動態(tài)數組,本文主要介紹了C++ vector如何動態(tài)申請內存的元素,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • KMP 算法實例詳解

    KMP 算法實例詳解

    這篇文章主要介紹了KMP 算法實例詳解的相關資料,MP的關鍵是求出next的值、先預處理出next的值,需要的朋友可以參考下
    2017-07-07
  • 舉例分析private的作用(c/c++學習)

    舉例分析private的作用(c/c++學習)

    我知道我們可以用 public 中的值,把private中的數據給提出來,但是還是搞不懂private該怎么用,或者說在一個具體程序中,private有什么用
    2020-08-08

最新評論