2016-11-24 1432 views
8

我現在正在學習C++,因爲我需要編寫一些低級程序。C#「var」和C++「auto」之間的區別

當我瞭解到「auto」關鍵字時,它提醒我「來自C#的」var「關鍵字。

那麼,C#「var」和C++「auto」有什麼區別?它看起來相同,看到他們的功能...

*不完全,但我明白了!感謝您的評論,回覆大家!

*我從回答中刪除了我的評論,因爲我看到了消息「避免消息」謝謝!'「。

*我有很多信息...非常感謝你!

+0

,它們都被用於類型推斷 – UnholySheep

+0

然後,他們都是相同的技術? –

+0

這兩個關鍵字可以達到相同的效果,只是使用不同的編程語言 – UnholySheep

回答

11

在C#中var關鍵字只能在本地內部功能:

var i = 10; // implicitly typed 

不僅變量,而且在功能和模板C++自動關鍵字can deduce類型:

auto i = 10; 

auto foo() { //deduced to be int 
    return 5; 
} 

template<typename T, typename U> 
auto add(T t, U u) { 
    return t + u; 
} 

從性能上來看查看,auto keyword in C++ does not affect performance。和var關鍵字does not affect performance as well

另一個區別可能在於IDE中的intellisense支持。在C#中的Var關鍵字可以很容易地推導出來,並且您將看到鼠標懸停的類型。在C++中使用auto關鍵字可能會更復雜,這取決於IDE。

+0

那麼,汽車可以用更廣泛的範圍? –

+0

是的,使用C++中的auto,您可以通過強類型檢查來構建整個扣分鏈。 – qub1n

+0

'var'不會影響C#中的性能,因此鏈接到的示例已損壞,因爲'List bar1 = Foo();'會產生編譯時錯誤。請參閱[Servy的評論](http://stackoverflow.com/questions/356846/will-using-var-affect-performance?rq=1#comment68562462_356855) –

6

它們是等效的。它們都允許你不要自己指定變量的類型,但變量保持強類型。下面的線在C#中是相同的:

var i = 10; // implicitly typed 
int i = 10; //explicitly typed 

而下面的線是等價的C++:

auto i = 10; 
int i = 10; 

但是,你應該記住,在C++中正確類型的auto變量是使用函數調用的模板參數推導規則確定的。

+1

再加一個。請注意,在C++的某些情況下,使用'auto'是不可避免的 - 比如當你使用lambda函數時。這在C#中也是如此嗎?還要注意''auto i = 10;'在C++ 11之前和之後有非常不同的含義(即使在這種特殊情況下,標準將'i'設置爲'int'類型)。 – Bathsheba

+0

爲什麼不可避免? 'auto' *會在編譯時解析爲具體或泛型類型。你可以用那個具體的類型替換它 –

+0

lambda函數的具體類型是? – Bathsheba

4

簡單來說,auto是一個比var更復雜的野獸。

首先,auto可能只是推導類型的一部分;例如:

std::vector<X> xs; 
// Fill xs 
for (auto x : xs) x.modify(); // modifies the local copy of object contained in xs 
for (auto& x : xs) x.modify(); // modifies the object contained in xs 
for (auto const& x : xs) x.modify(); // Error: x is const ref 

其次,auto可用於在一次聲明多個對象:

int f(); 
int* g(); 
auto i = f(), *pi = g(); 

第三,auto用作拖尾返回類型語法的一部分在函數聲明:

template <class T, class U> 
auto add(T t, U u) -> decltype(t + u); 

它也可以用於函數定義中的類型推導:

template <class T, class U> 
auto add(T t, U u) { return t + u; } 

第四,在將來可能會開始被用來聲明函數模板:因爲他們基本上是相同的

void f(auto (auto::*mf)(auto)); 
// Same as: 
template<typename T, typename U, typename V> void f(T (U::*mf)(V)); 
相關問題