一,C++關鍵字(C++98)
C++總計63個關鍵字,C語言32個關鍵字。
ps:下面我們只是看一下C++有多少關鍵字,不對關鍵字進行具體的講解。在以后的學習中會會了解的更深。
二,命名空間
2.1 命名沖突
在C語言的語法中,有時候會遇到這樣的情況:
#include <stdio.h>
#include <stdlib.h>
int rand = 0;
int main()
{
printf("%d\n", rand);
return 0;
}
我們的本意是創(chuàng)建一個全局的 rand 變量,再進行輸出。那為什么會報錯呢?
原因:這是因為 rand 是一個庫函數(shù),當我們包含頭文件 <stdlib.h> 時,在預處理階段會展開頭文件,里面的 rand 函數(shù)與我們定義的 rand 變量發(fā)生了沖突。編譯器會自動識別 rand 是一個庫函數(shù),而不是對整形打印。
2.2 關鍵字namespace
使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染 。
首先我們知道在全局域(全局變量)和局部域(局部變量),可以分別定義名字相同的變量,但是使用時是局部優(yōu)先。
那如何訪問全局變量呢?就要用到域作用限定符::
當域作用限定符前沒有其他符號時,就默認訪問全局變量。
命名空間的本質也是一個域,叫做命名空間域。
它與全局域和局部域的區(qū)別是:命名空間域不影響生命周期。
使用方法是:后面跟命名空間的名字,然后接一對{}即可,里面的內容為命名空間的成員。
使用變量,函數(shù)時,編譯器的默認查找規(guī)則是:先在當前局部域查找,再在全局域中查找,但是不會在命名空間域里查找。
當要指定打印命名空間域中的變量時,在域作用限定符前要加上域的名字。
2.2.1 命名空間中可以定義變量/函數(shù)/類型
注意:一個命名空間就定義了一個新的作用域,命名空間中的所有內容都局限于該命名空間中。
在 test.cpp 中:
namespace bit
{
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
2.2.2 命名空間可以嵌套
在大型項目中一般最多嵌套兩三層,平時不會嵌套。
在 test.cpp 中:
namespace N1
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
2.2.3 同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中。
比如在 test .h 中:
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}
一個工程中的 test.h 和上面 test.cpp 中兩個N1會被合并成一個。
但是合并后不能有同名的變量,函數(shù)等,否則也會報錯。要用嵌套解決。
2.3 命名空間的使用
2.3.1 指定訪問域中成員:加命名空間名稱及作用域限定符
2.3.2 使用using將命名空間中某個成員引入
可以指定域中的某個成員進行展開,使用它時可以不加作用域限定符。但是使用其他成員時要加。
比如 b 經(jīng)常使用,a 偶爾使用時:
2.3.3 使用using namespace 命名空間名稱 引入
當我們要多次使用域中某個成員時,每次都要 域名+限定符 十分麻煩。就可以使用 using namespace + 名稱 將域進行展開。
2.4 當兩個命名空間定義相同成員,同時展開時會報錯。
所以命名空間不能隨便展開!
namespace bit
{
int a = 0;
int b = 1;
int c = 2;
}
namespace hello
{
int a = 0;
int b = 1;
int c = 2;
}
//展開命名空間
using namespace bit;
using namespace hello;
int main()
{
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
printf("%d\n", a);
return 0;
}
2.5 總結
所以說,使用 using namespace 展開命名空間的本質可以理解為改變了編譯器默認的查找規(guī)則,不僅會先在局部域,全局域中查找,最后還會到命名空間域中查找。
但是要注意的是命名空間域的展開不是像頭文件在預處理時展開的那樣直接拷貝進來,而是相當于增加了一個聲明。
三,輸入&輸出
3.1 C++也有一套新的輸入輸出流。
cout 和 cin 包含在頭文件< iostream >中,在使用時為啥要展開命名空間 std 呢?
原因:是為了防止標準庫中定義的內容和你定義的內容發(fā)生沖突。std 是官方庫的命名空間,把標準庫里的內容保護起來。
說明:
- 使用cout標準輸出對象(控制臺)和cin標準輸入對象(鍵盤)時,必須包含< iostream >頭文件以及按命名空間使用方法使用std。
- cout和cin是全局的流對象,endl是特殊的C++符號,表示換行輸出,他們都包含在包含< iostream >頭文件中。
- <<是流插入運算符,>>是流提取運算符。
- 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時那樣,需要手動控制格式。
C++的輸入輸出可以自動識別變量類型。
注意:
關于cout和cin還有很多更復雜的用法,比如控制浮點數(shù)輸出精度,控制整形輸出進制格式等等。因為C++兼容C語言的用法,這些又用得不是很多,所以在涉及這方面時建議使用printf 來控制格式,這樣更方便。
3.2 std命名空間的使用慣例
std是C++標準庫的命名空間,如何展開std使用更合理呢?
- 在日常練習中,建議直接using namespace std即可,這樣就很方便。
- using namespace std展開,標準庫就全部暴露出來了,如果我們定義跟庫重名的類型/對象/函數(shù),就存在沖突問題。該問題在日常練習中很少出現(xiàn),但是項目開發(fā)中代碼較多、規(guī)模大,就很容易出現(xiàn)。所以建議在項目開發(fā)中使用,像std::cout這樣使用時指定命名空間 + using std::cout展開常用的庫對象/類型等方式。
四,缺省參數(shù)
4.1 缺省參數(shù)概念
缺省參數(shù)是聲明或定義函數(shù)時為函數(shù)的參數(shù)指定一個缺省值。在調用該函數(shù)時,如果沒有指定實參則采用該形參的缺省值,否則使用指定的實參。
舉例:文章來源:http://www.zghlxwxcb.cn/news/detail-860112.html
4.2 缺省參數(shù)的分類
4.2.1 全缺省參數(shù)
函數(shù)的所有參數(shù)均由自己指定。
4.2.2 半缺省參數(shù)
函數(shù)的參數(shù)部分傳實參,其余的自己指定。
半缺省參數(shù)必須從右往左缺省,如圖 b ,c 是缺省的,實參50床給 a。
注意:
- 半缺省參數(shù)必須從右往左依次來給出,不能間隔著給。
- 缺省參數(shù)不能在函數(shù)聲明和定義中同時出現(xiàn),若有聲明和定義分離的情況,只能在聲明中缺省。
舉例:
- 間隔缺省會報錯
#include <iostream>
using namespace std;
void Func(int a , int b = 20, int c )
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func(50, ,30);
return 0;
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-860112.html
到了這里,關于【C++】:C++關鍵字,命名空間,輸入&輸出,缺省參數(shù)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!