1. 程式人生 > 其它 >行內函數,預設引數,函式過載

行內函數,預設引數,函式過載

技術標籤:c++c++

行內函數,預設引數,函式過載

行內函數

1.行內函數是c++為提高程式執行速度所作的一項改進。行內函數為了繼承巨集函式的效率,沒有函式呼叫時開銷,然後又可以像普通函式 那樣,可以進行引數,返回值型別的安全檢查,又可以作為成員函式
2.是一個真正的函式。函式的替換 發生在編譯階段。
3.使用規則:

  1. 在函式宣告前加上關鍵字inline;
  2. 在函式定義前加上關鍵字inline;
    通常的做法是省略原型,將整個定義放在本應提高原型的地方。
    例:
    #include
using namespace std;
inline
int swap(int x, int y) { return x + y; } int main() { cout << "swap=" << swap(10, 20) << endl; }

在這裡插入圖片描述
注意:
行內函數條件: 1、不能存在任何形式的迴圈語句
2、不能存在過多的條件判斷語句
3、函式體不能過於龐大 不能對函式進行取址操作

預設引數和預設引數分檔案在宣告設定

1.預設引數指的是當函式呼叫中省略了實參自動使用的一個值。能夠使用不同數目的引數呼叫同一個函式。
2.定義函式時可以給形參指定一個預設的值,這樣呼叫函式時如果沒有給這個形參賦值(沒有對應的實參),那麼就使用這個預設的值。也就是說,呼叫函式時可以省略有預設值的引數。如果使用者指定了引數的值,那麼就使用使用者指定的值,否則使用引數的預設值。

例:

include<iostream>
using namespace std;
int swap(int x = 10, int y = 20)//函式的預設引數,指定預設值x=10,y=20
{
	return x + y;
}
int main()
{
		//函式傳參,預設引數無效
	cout << "swap=" << swap(100, 200) << endl;
		//如果某個引數沒有被傳參,將用預設值x:100,y使用20
	cout << "swap=" << swap(100) <<
endl; cout << "swap=" << swap() << endl; }

在這裡插入圖片描述2.函式的預設引數從左向右,如果一個引數設定了預設引數,那麼這個引數之後的引數都 必須設定預設引數
l例:

#include<iostream>
using namespace std;
int swap(int x,int y = 20,int z=30)
{
	return x + y+z;
}
int main()
{

	cout << "swap=" << swap(100, 200) << endl;

	cout << "swap=" << swap(100) << endl;
}

在這裡插入圖片描述
注:當函式宣告和函式定義分開寫,函式宣告和函式定義不能同時設定預設引數

2.預設引數分檔案在宣告設定
原始檔:

#include <iostream>
using namespace std;
extern int fun(int x,int y=25,int z=35);
int main()
{
    cout<<fun(100,200)<<endl;
    cout<<fun(100)<<endl;
}

在建立的檔案:

int fun(int x,int y,int z)
{
    return x+y+z;
}

在這裡插入圖片描述
注:1.分檔案 函式定義處的預設引數 是無效的
2 .建議:分檔案是 在宣告 給預設引數:

extern int fun(int x,int y=25,int z=35);

3佔位引數
1.介紹:函式的引數只有型別名,沒有形參名。
2.由於有型別名,所以函式呼叫的時候必須給佔位引數傳參。
3.沒有形參名,所以函式內部是無法使用佔位引數。
例:

#include<iostream>
using namespace std;
int swap(int x,int y ,int )
{
	cout << "x=" <<x<< ",y=" << y << endl;
	return 0;
}
int main()
{
	swap(10, 30, 40);

}

在這裡插入圖片描述

函式過載

1.函式多型是c++在c語言的基礎上新增的功能。而函式多型(函式過載)能夠使用多個同名的函式。
2.函式過載的條件: 同一個作用域 引數個數不同 引數型別不同 引數順 序不同。
例:

#include<iostream>
using namespace std;
void swap(int a)
{
	cout << "int" << endl;
}
void swap(int a, int b)
{
	cout << "int,int" << endl;
}
void swap(int a, double b)
{
	cout << "int ,double" << endl;
}
void swap(double a, int b)
{
	cout << "double int" << endl;
}
int main()
{
	swap(10);
	swap(10, 20);
	swap(10, 30.2);
	swap(10.1, 13);
}

在這裡插入圖片描述
注:函式的過載的規則:
1.函式名稱必須相同。
2.引數列表必須不同(個數不同、型別不同、引數排列順序不同等)。
3.函式的返回型別可以相同也可以不相同。
4.僅僅返回型別不同不足以成為函式的過載。

3.函式過載和預設引數一起使用,需要額外注意二義性問題的產生
例:

#include<iostream>
using namespace std;
void swap(int a)
{
	cout << "int" << endl;
}
void swap(int a, int b=20)
{
	cout << "int,int" << endl;
}
int main()
{
	swap(10);//產生二義性,兩個都能識別
}

在這裡插入圖片描述
是否可以通過使用預設引數來實現同樣的目的。例如:用兩個過載函式來代替面向字串的left()函式:

char * left(const char * str,unsigned n);
char * left(const char * str);

使用一個帶預設引數的函式簡單些。只需編寫一個函式,程式也只需為一個函式請求記憶體,需要修改函式,只需要修改一個,如何使用不同型別的引數,則預設引數不管用了。這種情況下,應該使用函式過載。

4.過載引用引數
1.類設計和STL經常使用引用引數。因此知道不同引用型別的過載很有用。例:

void sink(double & r1);
void sank(const double & r2);
void sunk(double && r3);

左值引用引數r1與修改的左值引數(如double變數)匹配;const左值引用引數r2與可修改的左值引數,const左值引數和右值引數(如兩個double的和)匹配,最後,右值引用引數r3與左值匹配,注意到與r1或r3匹配的引數都與r2匹配。帶來一個問題:如果過載使用這三個引數的函式,結果如何?答案是將呼叫最匹配的版本:

void staff(double & rs);
voit staff(const double & rcs);
void stove(double & r1);
void stove(const double & r2);
void stove(double && r3);

這讓你能夠根據引數是左值,const 還是右值來定製函式的行為:

double x=55.5;
const double y=32.0;
stove(x);
stove(y);
stove(x+y);

如果沒有定義函式stove(double &&);.stove(x+y)將呼叫函式stove(const double &);

何時使用函式過載:僅當函式基本上執行相同任務,但使用不同形式的資料時,才應採用函式過載。