C++語言是對C的一種擴充和優化,同時引入了OOP(面向對象編程)的思想。因此,建議掌握了C語言的基本使用和語法再進一步學習C++。同時瞭解C++與C語言的區別。ios
其實C++對C的擴充不少,在這裏描述一些經常使用的點。剩餘的瑣碎知識會慢慢的說到。程序員
#define _CRT_SECURE_NO_WARNINGS #include <iostream> //using namespace std; int atk = 200; void test() { int atk = 100; std::cout<<"test中的atk<< atk << std::endl; std::cout<<"全局中的atk<< ::atk << std::endl; } int main() { test(); return 0; }
這段代碼會一一講解#define \_CRT\_SECURE\_NO\_WARNINGS
這是一個宏,若是是使用vs系列的編譯器,在程序編譯的時候可能出現C4996錯誤,經過這個宏基本能夠解決這個問題編程
以後會涉及如下三個知識點:函數
using namespace std;
這是一句十分常見的代碼(但並不推薦這麼使用)
其中std是標準命名空間,若是不寫這條語句 會沒法使用諸如cout,cin 等等。由於C++標準的標識符都被記錄在std的命名空間中。除了以上的語句,咱們還可使用做用域運算符(::)來單獨的使用某一個標識符:std::cout<<"hello World!<<std::endl;"
其實更加推薦以上的寫法。
在C++中,程序員除了可使用系統提供的命名空間。還能夠本身寫命名空間,而命名空間的做用就是 消除名稱的衝突。
如下是namespace的使用:學習
//test1 #include <iostream> using namespace std; namespace test1 { void test() { cout<<"這裏是test1"<<endl; } } //test2 namespace test2 { void test() { cout<<"這裏是test2"<<endl; } } //main int main() { test1::test(); test2::test(); return 0; }
結果可想而知:
除此以外namespace還有如下幾點:優化
1.namespace下能夠放函數,變量,類,結構體spa
2.namespace必須做用到全局做用域中。code
3.nameapace能夠嵌套。(若是是嵌套的話須要連續使用做用域運算符)對象
4.namespace是開放的,能夠隨時添加內容blog
namespace A { ... } ... namespace A { ... }
這樣寫的話這兩個A是能夠鏈接起來,而不是覆蓋。
5.能夠有無名(匿名)的命名空間。至關於一個static只能在當前文件內使用(基本沒什麼用,知道有這麼回事就好了)
6.命名空間能夠有別名。若是起的第一個名字太長了,不方便使用。能夠用一個新的名字(仔細想一想好像也沒什麼用,畢竟起名是全部程序員不得不去面對的一個難題)
namespace test { int a = 10; } void test1() { using test::a;//using 聲明 std::cout<<a<<std::endl; }
using namespace test;//using 編譯聲明
[注]編譯器是有就近原則的。using聲明會與就近原則產生二義性,using編譯指令會服從就近原則;由於using編譯指令只是聲明瞭命名空間,不必定非要使用。而using聲明就是聲明nanespace裏面的一個標識符,這樣天然會衝突。
#include <iostream> using namespace std; namespace A { int aa = 10; } //using聲明: void test01() { int aa = 20; using A::aa; //寫下以上這行代碼,編譯器會報錯 //using聲明後,AtkofQOP便是在Dota2命名空間下的 //同時編譯器又是有就近原則的, //因此產生了二義性 cout<<aa<<endl; } namespace B { int aa = 30; } //using 編譯指令 void test02() { int aa = 20; //使用using 編譯指令 using namespace A;//打開A的命名空間,不必定會去使用,依舊是服從就近原則! cout<<aa<<endl; //輸出內容是20 //若是註釋int aa = 20; //同時打上 using namespace B,咱們在輸出aa時,編譯器就沒法辨認了 //若是使用(打開)的命名空間過多,注意必定要使用做用域運算符指定具體的位置 //這就是爲啥不推薦直接寫using namespace std;的緣由,用的多了會引發沒必要要的混亂 }
在一開始給出的例子中,咱們看到了::的做用(指定全局,其實就是::前面什麼都沒有,就默認是全局了)。結合namespace也不難理解::的做用。就是做用域是指定,這個做用域不只是namespace 還包括後面類的成員變量和成員函數。只要是須要指定變量或者函數的所屬,都會用到做用域運算符。