1.命名空間
在c++中,識別符號(name)可以是符號常量、變數、巨集、函式、結構、列舉、類和物件等。為了避免在大規模程式設計中以及在程式設計師使用各種各樣的c++庫時,這些識別符號的命名發生衝突,標準c++引入了關鍵字namespace(命名空間),以便更好控制識別符號作用域。
定義格式如下:
namespace 命名空間
例如:定義兩個命名空間aa1,aa2
#include
using
namespace
std;
namespace aa1
using宣告
在c++中,我們可以使用using可以不需要加字首「namespace_name::」的情況下訪問命名空間中的成員。using宣告同其他宣告一樣有乙個作用域,它引入的名字從宣告開始直到其所在的域結束都是可見的。
例如命名空間std,這是最常用的命名空間,標準c++庫中所有的元件都在該命名空間中宣告和定義。
例如:
#include
using
namespace
std;
int main ()
2.c++基本的輸入輸出流
c++的輸入和輸出功能除了支援c語言的輸入/輸出系統外,還可以有iostream庫提供。最常用的輸入/輸出運算子是「>>」和「<
(1)cin:標準輸入的istream類物件,使使用者能夠從終端讀資料,預設鍵盤。
(2)cout:標準輸出的ostream類物件,使使用者能夠從終端寫資料,預設是螢幕。
(3)cerr:標準錯誤的ostream類物件,cerr輸出程式錯誤,預設是螢幕。
#include
#include
using
namespace
std;
int main ()
void fun(char j)
int main()
會出現如下的錯誤:
而c++可以實現這樣的函式過載,那麼問題來了,為什麼c++支援函式過載,而c語言不支援呢?
從**的編譯到執行,在vs這種編譯器下,它是系統直接完成了翻譯與鏈結,直接生成了執行結果。
編譯器內部完成了翻譯部分:
1.預處理
1)標頭檔案展開
2)巨集的替換
3)去注釋
4)條件編譯
2.編譯過程:將高階語言轉為組合語言
3.彙編過程:組合語言轉為二進位制程式
鏈結部分:所引用的資料鏈結進來
比如乙個函式的宣告如下:
void fun(int i);
在c語言中,編譯器在編譯後在庫中的名字為_fun
在c++中,編譯器在編譯後在庫中的名字為_function_int
還有乙個函式的宣告如下:
void fun(char j);
在c語言中,編譯器在編譯後在庫中的名字為_fun
在c++中,編譯器在編譯後在庫中的名字為_function_char
在鏈結時,都是找名字進行鏈結的,就比如以上兩個函式,
在c語言中兩個的名字一樣,就會在鏈結中報錯。
c++中它們的名字不一樣,所以就不會報錯。
4.c++預設引數
如果函式說明或函式定義中為形參指定乙個預設值,則稱此函式為帶預設引數的函式。如果在呼叫時,指定了形參相對應的實參,則形參使用實參的值。如果未指定相應的實參,則形參使用預設值,這為函式的使用提供了很大的便利。
例如,函式int可以被說明為:
void init(int x = 1);
如果呼叫語句為init(2),則這個呼叫語句傳遞給形參的值為2,如果呼叫語句為init( ),則傳遞給形參的值為1。
如果函式有多個預設引數,則預設引數必須是從右向左定義,並且在乙個預設引數的右邊不能有未指定預設引數。
例如:
void fun(int a,int b = 1,int c = 4,int d = 5);
這個函式宣告語句是正確的,但是下面的宣告語句是錯誤的:
void fun(int a,int b = 1,int c,int d);
void fun(int a,int b = 1,int c,int d = 5);
預設引數分為全預設引數和半預設引數,例如:
// 全預設引數
int add1 (int a = 0, int b = 0)
// 半預設引數
int add2 (int a, int b = 0)
void test ()
【注意】
1. 帶預設值的引數必須放在參數列的最後面。
2. 預設引數不能同時在函式的宣告和函式定義中出現,二者只能選其一。
3. 預設值必須是常量或全域性變數。
4. 預設引數必須通過值參或常參傳遞。
5.指標和引用
c語言中函式有兩種傳參的方式:傳值和傳址。
以傳值方式,在函式呼叫過程中會生成乙份臨時變數用形參代替,最終把實參的值傳遞給新分配的臨時變數即形參。它的優點是避免了函式呼叫的***,確無法改變形參的值。如果要改變實參的值,只能通過指標傳遞。
void swap (int
*_pleft , int * _pright)
指標可以解決問題,但不是很形象友好,不安全,因此c++中引入了一種新的符合型別–引用。
引用概念
引用不是新定義乙個變數,而是給已存在變數取了乙個別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間。
定義的格式為:
型別 &引用變數名 = 已定義過的變數名;
【引用特性】
1. 引用在定義時必須初始化。
2. 乙個變數可以有多個引用。
3. 引用一旦繫結了乙個實體,就不能再改變為其他變數的引用。
void test()
使用場景
【函式形參】
void swap(int &_ileft, int &_iright)
【返回值】
// 值返回
int add(int _ileft, int _iright)
// 引用返回
int& add(int & _ileft, int& _iright)
引用與指標的區別
【相同點】
底層的實現方式相同,都是按照指標的方式來實現的
【不同點】
void test()
總結:
1、引用在定義時必須初始化,指標沒有要求。
2、一旦乙個引用被初始化為指向乙個物件,就不能再指向
其他物件,而指標可以在任何時候指向任何乙個同型別物件
3、沒有null引用,但有null指標。
4、在sizeof中含義不同:引用結果為引用型別的大小,
但指標始終是位址空間所佔位元組個數。
5、引用自加改變變數的內容,指標自加改變了指標指向
6、有多級指標,但是沒有多級引用
7、引用比指標使用起來相對更安全
c 基礎知識篇 初識c
我已經進行了小半年的c 程式設計工作了,先將之前看的參考書的知識進行簡單梳理來增強對c 的理解。梳理將按照參考書的順序,以小知識點的形式進行,c 初學跟著學習會事半功倍。1 c 程式必須且只能包含乙個main函式,main函式的返回值用來指示程式執行的狀態。2 c 原始檔的字尾型別 cc cpp c...
C 基礎知識篇 C 數字
通常,當我們需要用到數字時,我們會使用原始的資料型別,如 int short long float 和 double 等等。這些用於數字的資料型別,其可能的值和數值範圍,我們已經在 c 資料型別一章中討論過。我們已經在之前章節的各種例項中定義過數字。下面是乙個 c 中定義各種型別數字的綜合例項 in...
C 基礎知識篇 C 陣列
c 支援陣列資料結構,它可以儲存乙個固定大小的相同型別元素的順序集合。陣列是用來儲存一系列資料,但它往往被認為是一系列相同型別的變數。陣列的宣告並不是宣告乙個個單獨的變數,比如 number0 number1 number99,而是宣告乙個陣列變數,比如 numbers,然後使用 numbers 0...