程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ auto類型解釋符

C++ auto類型解釋符

編輯:關於C++

C++ auto類型解釋符。本站提示廣大學習愛好者:(C++ auto類型解釋符)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ auto類型解釋符正文


編程經常常須要把表達式的值賦給變量,這就請求在聲明變量的時刻清晰曉得表達式的類型。但是要做到這一點並不是那末輕易,有時刻乃至基本做不到。為懂得決這個成績,C++11尺度引入了auto類型解釋符,用它就可以讓編譯器替我們去剖析表達式所屬的類型。

與本來那些只對應一種特定類型的解釋符分歧,auto讓編譯器經由過程初值來推算變量類型。明顯,auto界說的變量必需要有初始值。

應用auto具有以下幾點利益:

靠得住性:假如表達式的類型產生更改(包含函數前往值產生更改的情形),它也能任務。
機能:確保將不會停止轉換。
可用性:不用擔憂類型稱號拼寫艱苦和拼寫有誤。
效力:代碼會變得更高效。

auto item = val1 + val2; // 由val1和val2相加的成果揣摸出item的類型
auto i=0, *p = &i; // i是整數,p是整型指針

應用auto能在一條語句中聲明多個變量。然則一條聲明語句只能有一個根本數據類型,所以該語句中一切變量的初始根本數據類型都必需分歧:

auto sz = 0, pi = 3.14; // Error!

編譯器揣摸出的auto類型有時刻和初始值的類型其實不完整一樣,編譯器會恰當地轉變成果類型使其更相符初始化規矩,例如:

應用auto會刪除援用

int count = 10;
int& countRef = count;
auto myAuto = countRef;

countRef = 11;
cout << count << " "; // print 11

myAuto = 12;
cout << count << endl; // print 11

你能夠會以為 myAuto 是一個 int 援用,但它不是。它只是一個 int,由於輸入為 11 11,而不是 11 12;假如 auto 還沒有刪除此援用,則會湧現此情形。

const限制符
先引入一種表述:頂層const表現指針自己是個常量,底層const表現指針所指的對象是一個常量。普通auto會疏忽失落頂層const,同時底層const則會保存上去,例如:

int i = 0;
const int ci = i, &cr = ci;
auto b = ci; // b 是一個整數(ci的頂層const特征被疏忽失落)
auto c = cr; // c 是一個整數(cr是ci的別號,ci自己是一個頂層const)
auto d = &i; // d 是一個整型指針(整數的地址就是指向整數的指針)
auto e = &ci; // e 是一個指向整數常量的指針(對常量對象取地址是一種底層const)

假如願望揣摸出的auto類型是一個頂層const,須要明白指出:

const auto f = ci; // ci 的推演類型是int,f是const int類型

還可以將援用的類型設置為auto,此時本來的初始化規矩依然實用:

auto &g = ci; // g是一個整型常量援用,綁定到ci
auto &h = 42; // Error: 不克不及為異常量援用綁定字面值
const auto &j = 42; // OK: 可認為常量援用綁定字面值

切記,符號*和&只附屬於某個聲明,而非根本數據類型的一部門,是以初始值必需是統一類型:

auto k = ci, &l = i; // k是整數,l是整型援用
auto &m = ci, *p = &ci; // m是對整型常量的援用,p是指向整型常量的指針
auto &n = i, *p2 = &ci; // Error: i的類型是int,而&ci的類型是const int

附上更多示例代碼:

上面的聲明等效。在第一個語句中,將變量j 聲明為類型 int。在第二個語句中,將變量 k 推導為類型 int,由於初始化表達式 (0) 是整數

int j = 0; // Variable j is explicitly type int.
auto k = 0; // Variable k is implicitly type int because 0 is an integer.

以下聲明等效,但第二個聲明比第一個更簡略。應用 auto 症結字的最使人佩服的一個緣由是簡略

map<int,list<string>>::iterator i = m.begin(); 
auto i = m.begin(); 

應用 iter 和 elem 啟動輪回時

#include <deque>
using namespace std;

int main()
{
  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
  { /* ... */ }
}

上面的代碼片斷應用 new 運算符和指針聲明來聲明指針

double x = 12.34;
auto *y = new auto(x), **z = new auto(&x);

下一個代碼片斷在每一個聲明語句中聲明多個符號。請留意,每一個語句中的一切符號將解析為統一類型。

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.

此代碼片斷應用前提運算符 (?:) 將變量 x 聲明為值為 200 的整數:

int v1 = 100, v2 = 200;
auto x = v1 > v2 ? v1 : v2;

上面的代碼片斷將變量 x 初始化為類型 int,將變量 y初始化對類型 const int 的援用,將變量 fp 初始化為指向前往類型 int 的函數的指針。

int f(int x) { return x; }
int main()
{
  auto x = f(0);
  const auto & y = f(1);
  int (*p)(int x);
  p = f;
  auto fp = p;
  //...
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved