1. 程式人生 > >c++中 預設定義 函式過載 引用

c++中 預設定義 函式過載 引用

##概要

本片部落格 的主要內容有, c++中函式預設定義、 函式過載的機制 、函式名在VS環境下編譯後的修改,引用 及其 注意事項。最後列了一個表

文章目錄

預設定義

預設引數

預設引數是宣告或者定義函式的引數的時候指定一個預設值。在呼叫該函式時候。如果沒有指定實參,那麼就採用預設值進行處理。

  		void TestRet(int number = 10)
    	{
    		cout << number <<endl;
    	}
    
    	int main()
    	{
    		TestRet();
    		TestRet(100);
    		return 0;

以上函式中,第一個TestRet將列印預設值 10。第二個TestRet將列印傳輸值 100。

預設引數的分類

全預設引數 :所有的引數都帶有預設值。


int TestFunc(int a=10,int b=20,int c=30)
{
	cout<< a <<endl;
	cout<< b <<endl;
	cout<< c <<endl;
}

半預設引數 : 只能從右向左依次寫入預設

    int TestFunc(int a=10,int b=20,int c)
    {
    	cout<< a <<endl;
    	cout<< b <<
endl; cout<< c <<endl; }

注意事項:

1.半預設引數必須從右向左來寫入,不能間隔著寫出來

2.預設引數不能同時在宣告和定位的位置,要麼在函式宣告的時候設定好預設,要麼在定義函式的時候設定預設。

3.預設的值必須是常量,和全域性變數

函式過載

過載的定義

函式過載的概念:對於同一個作用域來說,函式的名字必須相同,引數列表必須不同。其中引數列表包含了引數的個數,引數的型別,型別的次序,與返回值的型別沒有關係.

一下例子是錯誤的

	long TestRet(double a ,double b)
	{
		return a+b;
	}

	short TestRet(double a,double b)
	{
		return a+b;
	}

上面的例子中,引數列表完全相同,但是它的返回值型別卻不相同。實際上,以上引數沒有進行函式過載

函式在編譯後的名字修飾問題

	int add(int a, int b);
    
    int main()
    {
    	add(1, 2);
    
    	return 0;
    }

在C語言的環境下進行編譯,它的命名規則是 _ + 函式名字

在這裡插入圖片描述

在Vs 2013 C++的環境下進行編譯,它的命名規則是 看似的雜亂的序列。

在這裡插入圖片描述

分析 :

首先是以 ? 號開始 + 函式的名字 + @ 表明函式的名字

接著以 YA開始 + H (表明整形) + H(表明第一個引數的型別) +H(表明第二個引數的型別) + @ 此段表明函式引數列表的內容

最後 以 Z表明這個函式的丁一結束

如果要想在C++編譯環境中使用 C語言風格編譯 只需要在函式前加入

extern "C" int Add(int a,int b)

引用 &

怎麼使用引用 & 符號?

首先在C語言當中寫一個交換程式。


	void Swap(int left, int right)
	{
		int temp = left;
		left = right;
		right = temp;
	}

這種傳值呼叫沒有函式的副作用,不會影響外部的實參,也就是說無法通過形參的改變,來改變外部的實參。

void Swap(int *left,int *right)if( left == NULL &&  right == NULL)
		{
			exit(0);
		}
	int temp = *left;
	*left = *right;
	*right = temp;
}

這種函式的副作用明顯,函式使用前必須先驗空。但是能夠達到通過改變形參來影響實參。

這個時候C++提供了一種方便的概念,即引用 &。引用的大體意思就是給引數變數起一個別名。

	void Add(int &right,int &left)
	{
		int temp = right;
		right = left;
		left = temp;
	}

應用變數不會開闢動態記憶體空間。 因為它是已存在的變數的別名。

	int main()
	{
		int a = 10;
		int &ra = a;
		return 0;
	}

引用的特性:

1.引用在定義時必須初始化
2.一個變數可以有多個引用
3.引用一但被定義就不能再次引用了

引用的常屬性帶來的麻煩

const型別的變數常引用分析

	int main()
	{
		const int a = 10;
		//1.  int &ra = a; 錯誤的做法,如果a具有常屬性,那麼它的引用也必須有常屬性
		const int &ra = a;

		//2. int &b = 10; 10是一個立即數,它具有常屬性。那麼它的引用也必須有常屬性
		const int &b = 10;
		
		//3.double d = 12.34;
		//  int &rd = d;

		//編譯不通過,變數的型別不同,可能會造成資料丟失。

		double d = 12.34;
		const int &rd = d;
		
		return 0;
	}

對於3,出現問題的原因是,double 型別的資料被引用了int 的別名。會造成小數部分的捨去,但是 int &rd是錯誤的。說明double 型別的資料建立了新的空間。並且這個空間是具有常屬性的。

在這裡插入圖片描述

引用變數作為返回值出現隨機值得情況

以下程式碼的輸出結果是 10 ,隨機值,隨機值。

    #include<iostream>
    using namespace std;
    
    int& TestRef()
    {
    	int ret = 10;
    	return ret;
    }
    
    int main()
    {
    	int &a = TestRef();
    	printf(" %d \n", a);
    	printf(" %d \n", a);
    	printf(" %d \n", a);
    
    	return 0;
    }

有以下執行過程:

在這裡插入圖片描述

c++中的關鍵字

資料型別:

void int char float double bool w_char

型別定義:

struct union enum class typedef

真值:

true false

型別修飾符:

long short signed unsigned

型別限定符:

const volatile restrict const_case static static_case

儲存說明符:

auto register static extern thread_local mutable

其他修飾符:

inline asm

迴圈控制:

for while do

跳轉控制:

break continue return goto

分支結構:

if else switch case default

記憶體管理:

new delete

訪問限定符:

this friend virtual mutable explicit operator

類訪問修飾符:

private protected public

模板:

template typename

名稱空間:

namespace using

異常處理:

throw try catch