C++內斂函數,auto關鍵字及範圍for

內斂函數

函數想必大家熟悉的不能再熟悉了,那我們先來看看這個函數

#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時,循環迭代的範圍必須時確定的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章