(六)內聯函式
(七)auto關鍵字(c++11)
(八)基於範圍的for迴圈(c++11)
(九)指標空值nullptr(c++11)
使用cout標準輸出(控制台)和cin標準輸入(鍵盤)時,必須包含< iostream >標頭檔案以及std標準命名空間。
使用c++輸入輸出更方便,不需增加資料格式控制,比如:整形–%d,字元–%c。
#include
//輸入輸出流
using
namespace std;
//命名空間
intmain()
1、定義:
namespace 名稱
2、用法:
比如定義了兩個同名的函式,在主函式裡面如何引用呢?
void
fun(
)void
fun(
)int
main()
我們發現,這時候根本不能通過編譯,那該怎麼辦呢?這個時候,就可以用到我們的命名空間,解決方案如下:
namespace a};
namespace b};
using
namespace a;
//想用哪個就呼叫哪個
intmain()
定義:預設引數是宣告或定義函式時為函式的引數指定乙個預設值。在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。
1、全預設引數
void
testfunc
(int a =10,
int b =20,
int c =30)
2、半預設引數
void testfunc(int a, int b = 10, int c = 20)
注意:半預設引數必須從右往左依次來給出,不能間隔著給預設引數不能在函式宣告和定義中同時出現。一般寫到宣告的時候。
定義:是函式的一種特殊情況,c++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表(引數個數 或 型別 或 順序)必須不同,常用來處理實現功能類似資料型別不同的問題。
int
add(
int left,
int right)
double
add(
double left,
double right)
long
add(
long left,
long right)
intmain()
這種現象在c語言中是不支援的,即c語言不支援同名函式,但是c++是支援的,即函式的過載,但是呼叫的時候,該呼叫哪個呢?這就涉及到另乙個概念——名字修飾。
在編譯的時候,每個編譯器會根據自己的函式名修飾規則來對函式重新命名。比如:
int
max(
int a,
int b)
//編譯器重新命名為:?max@@yahhh@z
char
max(
char a,
char b)
//編譯器重新命名為:?max@@yaddd@z
引用不是新定義乙個變數,而是給已存在變數取了乙個別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間。
int
main()
注意:
引用在定義時必須初始化
乙個變數可以有多個引用
引用一旦引用乙個實體,再不能引用其他實體
定義乙個函式將兩個變數的值交換
在c語言中的實現方法是 將函式形參定義成指標型別(形參為臨時變數,不能改變實參,呼叫函式後被摧毀。)
//c語言實現方法
void
exchange
(int
*a,int
* b)
intmain()
當用用用解決時,形參可以直接定義為引用變數,不單獨分配空間,時間、空間效率高。
//引用變數實現方法
void
exchange
(int
&a,int
&b)int
main()
(1)constconst修飾的量為乙個常量即不能被修改的量。
如:int a=10;指定義了乙個變數a並初始化為10,但是後面可以對a的值進行修改。
但是 const int a = 10;指的是定義了乙個常量10,後面並不能被修改。
(2)const和指標結合時的用法
(3)對指標、陣列、結構體的引用
struct student
;int
main()
;//指標的引用
int*p =
&a;int
*&q = p;
//陣列的引用
int(
&brr)[10
]= arr;
//&brr要加括號,因為&優先順序沒有高。
//結構體引用
student s;
student &rs = s;
}
(4)引用和指標的區別
引用在定義時必須初始化,指標沒有要求
引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別
實體沒有null引用,但有null指標
引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小
有多級指標,但是沒有多級引用
訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理
引用比指標使用起來相對更安全
以inline修飾的函式叫做內聯函式,編譯時c++編譯器會在呼叫內聯函式的地方展開,沒有函式壓棧的開銷,內聯函式提公升程式執行的效率。
//內聯函式
inline
void
exchange
(int
*a,int
* b)
intmain()
inline是一種以空間換時間的做法,省去呼叫函式額開銷。所以**很長或者有迴圈/遞迴的函式不適宜使用作為內聯函式。
inline對於編譯器而言只是乙個建議,編譯器會自動優化,如果定義為inline的函式體內有迴圈/遞迴等等,編譯器優化時會忽略掉內聯。
可以自動推到變數型別
int a =10;
auto b = a;
//此時b也為int型、
用auto宣告指標型別時,用auto和auto*沒有任何區別,但用auto宣告引用型別時則必須加&。
auto p =
&a;//等價於 auto *p = &a;
auto
&b = a;
//引用
當在同一行宣告多個變數時,這些變數必須是相同的型別,否則編譯器將會報錯,因為編譯器實際只對第乙個型別進行推導,然後用推導出來的型別定義其他變數。
auto a =
1, b =2;
auto c =
3, d =
4.0;
// 該行**會編譯失敗,因為c和d的初始化表示式型別不同
注意:
auto不能作為函式的引數
auto不能直接用來宣告陣列
為了避免與c++98中的auto發生混淆,c++11只保留了auto作為型別指示符的用法
auto在實際中最常見的優勢用法就是跟以後會講到的c++11提供的新式for迴圈,還有lambda表示式等
進行配合使用。
對於乙個有範圍的集合而言,由程式設計師來說明迴圈的範圍是多餘的,有時候還會容易犯錯誤。因此c++11中
引入了基於範圍的for迴圈。for迴圈後的括號由冒號「 :」分為兩部分:第一部分是範圍內用於迭代的變數,第二部分則表示被迭代的範圍。
列印陣列內容:
int s=
;for
(const
auto
&b:s)
cout << endl;
使用條件:
for迴圈迭代的範圍必須是確定的
對於陣列而言,就是陣列中第乙個元素和最後乙個元素的範圍;對於類而言,應該提供begin和end的
方法,begin和end就是for迴圈迭代的範圍。
迭代的物件要實現++和==的操作
在傳統的c標頭檔案(stddef.h)中null實際是乙個巨集,null可能被定義為字面常量0,或者被定義為無型別指標(void*)的常量。不論採取何種定義,在使用空值的指標時,都不可避免的會遇到一些麻煩。 所以為了提高**的健壯性,在後續表示指標空值時建議最好使用nullptr。
另外注意:
在使用nullptr表示指標空值時,不需要包含標頭檔案,因為nullptr是c++11作為新關鍵字引入的。
C 入門基礎知識
1.c 基本資料型別 整型int 字元型 char 浮點型 float double 邏輯性 bool 無型別 void 也稱內建型別 語言內部 已定義好的型別 非基本資料型別 陣列 type 指標 type 結構體 struct 聯合體 union 列舉 enum 類 class 這些即就是自定義...
c 入門基礎知識
名字空間 namespace,即名字空間,是指 識別符號的各種可見範圍。c 標準程式庫 中的所有識別符號都被定義於乙個名為std的namespace中。使用 using namespace 可以使得後面不需要每次指定名字空間。1 名字 空間除了 系統定義 的名字空間之外,還可以自定義,定義 名字空間...
C 入門基礎知識
一 命名空間 命名空間 實際上就是乙個由程式設計者命名的記憶體區域,程式設計者可以根據需要指定一些有名字的空間域,把一些全域性實體分別放在各個命名空間中,從而與其他全域性實體分隔開來。它相當於乙個更加靈活的檔案域 全域性域 可以用花括號把檔案的一部分括起來,並以關鍵字namespace開頭給它起乙個...