作用:返回運算元指定表示式的型別。在這個過程中,編譯器會分析表示式並得到它的型別,卻不實際計算表示式的值
在存在初始化**的情況下,可以使用auto來自動決定變數的型別。還存在一種情況,我們希望變數的型別通過初始化**之外的表示式推斷得到。
假設有下面結構體:
struct point;
在其他地方,可能這樣定義point型別的變數/變數:
point point;
point* p1 = nullptr;
在c++中提供了另一種方式來決定變數的型別:decltype修飾符。利用它可以通過表示式的型別來決定變數的型別
decltype(point)* p2 = nullptr;
這兩種方式有什麼不同呢?當point的型別發生變化時,p1的型別需要一起修改,p2的型別就不需要修改
這和sizeof()的引數提倡使用變數名而不是資料型別是一樣的道理。
(1)auto用來實現變數的拷貝,包括變數值和型別。decltype只是用來獲取變數的型別,並沒有用其值來初始化新變數。
#include #include using namespace std;
extern const int a = 3;
int main()
總結:decltype根據乙個變數獲取資料型別,然後我們可以用資料型別來建立變數,陣列,指標等。
#include #include using namespace std;
extern const int a = 3;
void main()
; cout << typeid(dec).name() << endl; // int[10]
for (auto i:dec)
cin.get();
}
總結:auto只能拷貝乙個變數,decltype本質是為了拷貝型別。
(2)與const的關係
#include #include using namespace std;
int main()
總結:auto會忽略頂層const,decltype不會。auto編譯器推斷出的型別值可能會跟不同,比如頂層const,但是decltype會保留
#include using namespace std;
template void show(t *p) //模板指標
int main()
decltype是記憶體拷貝
#include using namespace std;
template void show(t *p) //模板指標
; for (auto i : num) }
int main()
c c 程式設計風格
1.程式設計風格 請寫出 bool flag 與 零值 比較的 if 語句。3分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if flag 0 請寫出 float x 與 零值 比較的 if 語句...
C C 程式設計規範
1 注意 strncpy strncat等帶n版本的字串操作函式在源字串長度超出n標識的長度時,會將包括 0 結束符在內的超長字串截斷,導致 0 結束符丟失。這時需要手動為目標字串設定 0 結束符。char dst 11 注意 最好每次定義時初始化為0 dst 11 char src 0123456...
C C 程式設計例項
例項1 設某次體育比賽的結果有4中可能 勝 win 負 lose 平局 tie 比賽取消 cancel 編寫程式順序輸出這4中情況。知識點 主要是練習列舉型別enum的使用 編譯執行結果 例項2 將兩個整數交換次序後輸出。知識點 值傳遞是指當發生函式呼叫時,給形參來分配記憶體空間,並用實參來初始化形...