c 函式過載 預設引數 命名空間的解析

2021-08-17 06:13:48 字數 2788 閱讀 6365

1.c和c++的優缺點解析

c語言屬於面向過程。

優點是:效能比物件導向高,因為類呼叫時需要例項化,開銷比較大,比較消耗資源。

缺點:沒有物件導向易維護、易復用、易擴充套件

c++屬於物件導向

優點是:易維護、易復用、易擴充套件,由於物件導向有封裝、繼承、多型性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護

缺點:效能比面向過程低

物件導向程式設計(英語:object-oriented programming,縮寫:oop)是一種程式設計范型,同時也是一種程式開發的方法。物件指的是類的例項。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性

而c++是基於物件導向的語言,因為它包含了c的一部分,而c語言是面向過程。物件導向更符合人類思維模式。

2.函式過載解析

各位應該都知道在c語言中不支援過載,而c++中卻支援過載,這是為什麼呢?接下來我們仔細分析分析。

舉例建立三個檔案:test.h test.c main.c

執行檔案時分為下面四個過程

過程

執行的操作

生成的檔案

1.預處理

展開標頭檔案、巨集替換、去掉注釋、條件編譯

test.i main.i

2.編譯

檢查語法詞法並生成彙編**

test.s main.s

3.彙編

彙編**變為機器認識的機器碼

test.0 main.o

4.鏈結

鏈結到一起生成可執行程式

a.out

這是main.c中的函式

#include"test.h"

void func(int i)

這是test.c的函式

#include"test.h"

void func(char c)

void func2(int x, int y)

void func3(int x = 10, int y = 20)

int main()

就像func1在呼叫時實參為空,這就叫做預設引數,而在定義時有預設引數並且已經給出預設值,函式呼叫時就可以直接呼叫。而func2中只省略了右邊引數y的值,因此實參只寫了乙個引數,func3中實參都寫了,所以呼叫時就不會用到預設引數的值,如果沒有寫就會直接呼叫預設引數

預設引數有一下規則:

1.呼叫時你只能從最後乙個引數開始進行省略,中間不能間斷。

void func(int a=1,int b,int c=3, int d=4); //error
2.預設值必須是常量

3.函式宣告時有預設引數,定義時就不能給出缺省引數了,就像func2()一樣

4.預設引數與函式過載一塊使用時就要注意了

如果一組過載函式(可能帶有預設引數)都允許相同實參個數的呼叫,將會引起呼叫的二義性。例如:

void func(int x); //過載函式一

void func(int x,int y=4); //過載函式二,帶有預設引數

void func(int x=3,int y=4); //過載函式三,帶有預設引數

func

(7); //error: 到底呼叫3個過載函式中的哪個?

func

(20,30) //error:到底呼叫後面2個過載函式的哪個?

這樣就會出現問題,所以讀者在應用時要特別注意

5.預設值的限定:預設值可以是全域性變數、全域性常量,甚至是乙個函式,但不能是區域性變數,區域性變數

因為預設引數的函式呼叫是在編譯時確定的,而區域性變數的位置與值在編譯時均無法確定

4.命名空間解析

命名空間:在c++ 中,名稱(name)可以是符號常量、變數、巨集、函式、結構、列舉、類和物件等等。為了避免在大規模程式的設計中,以及在程式設計師使用各種各樣的c++庫時,這些識別符號的命名發生衝突,標準c++引入了關鍵字namespace(命名空間),這些識別符號的作用域只在本空間域內有效,從而合理的解決命名衝突。

eg:

namespacen1}

cout << n1::a << endl;

cout << n1::n2::a << endl;

上面例子說明在不同的命名空間裡可以定義相同的名稱,不會出現命名衝突問題

c++中有乙個標準的命名空間

using namespace std;

c++ 庫的所有識別符號都是在std的命名空間中定義的,或者說標準標頭檔案(iostream)中的函式、類、物件和類模板是在命名空間std中定義的。所以在c++程式的一開始,就用using namespace對std進行全域性宣告

如果你一開始不寫這個命名空間就會編譯出錯,要麼你就得給所以std命名空間下的成員加上這個eg:

std:

:cout

<< n1:

:a<< std:

:endl;

std:

:cout

<< n1:

:n2:

:a<< std:

:endl;

c 命名空間 函式過載 預設引數

在c c 中,變數 函式和類都是大量存在的,這些變數 函式和類的名稱將都存在於全域性作用 域中,可能會導致很多衝突。使用命名空間的目的是對識別符號的名稱進行本地化,以 避免命名衝突或名字汙染,namespace 關鍵字的出現就是針對這種問題的。1.1 命名空間的定義 namespace n1 1.1...

C 命名空間 預設引數 函式過載

使用命名空間是要對識別符號的名稱進行本地初始化,避免命名衝突。定義命名空間需要用到namespace關鍵字,後跟命名空間的名字,在 內為命名空間的成員 普通的命名空間 namespace n1 巢狀的命名空間 namespace n2 namespace n3 同一工程中允許存在多個相同名稱的明明空...

命名空間 預設引數 函式過載 extern C

2.預設引數 3.函式過載 4.extern c c 中的類和庫中有大量的關鍵字,那麼我們定義變數的時候就很容易與這些系統關鍵字發生衝突,使用命名空間的目的就是為了避免與關鍵字發生衝突 舉個簡單的例子,有人來學校找乙個叫張三的人,廣播出去後有非常多叫張三,這樣就導致了混淆,不知道你要找誰。但是你如果...