內斂函數
函數想必大家熟悉的不能再熟悉了,那我們先來看看這個函數
#include<iostream>
using namespace std;
int add(int a,int b)
{
return a + b;
}
int main()
{
int num1 = 10;
int num2 = 20;
int answer = add(num1,num2);
cout<<answer<<endl;
return 0;
}
這個函數非常簡單,實現兩個數的加法。我們知道函數的實現回有壓棧的開銷,這樣會影響程序的效率,所以,在這裏我們引入了內聯函數。
內聯函數:以inline修飾的函數叫做內聯函數,編譯時C++編譯器會在調用內聯函數的地方展開,沒有函數壓棧的開銷, 內聯函數提升程序運行的效率。
#include<iostream>
using namespace std;
inline int add(int a,int b)//內聯函數
{
return a + b;
}
int main()
{
int num1 = 10;
int num2 = 20;
int answer = add(num1,num2);
cout<<answer<<endl;
return 0;
}
內斂函數具有以下特性:
1. inline是一種以空間換時間的做法,省去調用函數額開銷。所以代碼很長或者有循環/遞歸的函數不適宜 使用作爲內聯函數。
2. inline對於編譯器而言只是一個建議,編譯器會自動優化,如果定義爲inline的函數體內有循環/遞歸等 等,編譯器優化時會忽略掉內聯。
3. inline不建議聲明和定義分離,分離會導致鏈接錯誤。因爲inline被展開,就沒有函數地址了,鏈接就會 找不到。
(C++11)auto關鍵字
在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有 人去使用它。
C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作爲一個新的類型 指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。
例如:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
auto b = a;//編譯時,確定b爲int型
auto c = 10;//編譯時確定c爲int型
auto d = 10.2;//編譯時確定d爲浮點型
auto e = 'c;//編譯時確定e爲字符型
}
注意:使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類 型。因此auto並非是一種“類型”的聲明,而是一個類型聲明時的“佔位符”,編譯器在編譯期會將auto替換爲 變量實際的類型。
auto的使用細則
1.如果使用auto關鍵字定義指針時,使用auto或auto*都是可以的,但是如果使用auto定義引用變量時,必須加上&
int a = 10;
auto b = &a;
auto* c = &a;
//這兩種指針用法都是一樣的
int& d = a;//定義引用變量d,auto後必須加上&
2.使用auto定義則一行多個變量,則他們的類型必須相同
auto a = 10,b = 20, c = 30;//a,b,c三個變量都爲整型
上述寫法正確,但是下面的寫法則會出錯
auto a = 10,b = 12.5,c= 'c';//a,b,c三個變量的類型不一致,編譯出錯
因爲使用auto定義一行多個變量時,編譯器實際只對 第一個類型進行推導,然後用推導出來的類型定義其他變量。
當然,也有auto不能推導的時候
1.auto 不能作爲函數的參數
void test(auto a)
{}
如果寫成上述樣例,則在編譯時,編譯器無法對a的類型進行推到,則會編譯出錯
2.不能直接用來聲明數組
(C++11)範圍for
對於for循環,我們要遍歷一個數組,格式如下
void test()
{
int array[] = {1,2,3,4,5,6};
for(int i = 0;i<sizeof(array)/sizeof(array[0]);i++)
{
cout<<array[i]<<" ";
}
}
我們知道這個數組的範圍是確定的。那麼對於一個範圍確定的集合來說,由程序員說明循環的範圍,很明顯是多餘的,而且也容易寫錯,因此產生了範圍for的用法。
範圍for : for循環後的括號由冒號“ :”分爲兩部分:第一部分是範圍內用於迭代的變量, 第二部分則表示被迭代的範圍。
比如上面的輸出數組,可以寫成這樣:
void test()
{
int array[] = {1,2,3,4,5,6};
for(auto e:array)
{
cout<<array[i]<<" ";
}
}
這裏推薦使用auto,因爲我們可以不需要知道要迭代的變量的類型,交給auto即可,array則是被迭代的範圍,表示是這個數組的範圍。
**如果對於一個傳入數組的函數來說,該方法則不行。**比如:
void test(int array[])
{
//array變成一個指針類型,沒有確定的數據範圍
for (auto e : array)
cout << e << " ";
cout << endl;
}
因爲array變成了一個指針,此時範圍不再確定,則會出錯。
注意:使用範圍for時,循環迭代的範圍必須時確定的。