C++學習記錄(一)

C++對C的擴充

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錯誤,經過這個宏基本能夠解決這個問題編程

以後會涉及如下三個知識點:函數

命名空間(namespace)

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;
}

結果可想而知:
image.png
除此以外namespace還有如下幾點:優化

1.namespace下能夠放函數,變量,類,結構體spa

2.namespace必須做用到全局做用域中。code

3.nameapace能夠嵌套。(若是是嵌套的話須要連續使用做用域運算符)對象

4.namespace是開放的,能夠隨時添加內容blog

namespace A
{
    ...
}

...

namespace A
{
    ...
}

這樣寫的話這兩個A是能夠鏈接起來,而不是覆蓋。
5.能夠有無名(匿名)的命名空間。至關於一個static只能在當前文件內使用(基本沒什麼用,知道有這麼回事就好了)

6.命名空間能夠有別名。若是起的第一個名字太長了,不方便使用。能夠用一個新的名字(仔細想一想好像也沒什麼用,畢竟起名是全部程序員不得不去面對的一個難題)

using聲明和using編譯指令

using聲明
namespace test
{
    int a = 10;
}
void test1()
{
    using test::a;//using 聲明
    std::cout<<a<<std::endl;
}
using 編譯指令

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 還包括後面類的成員變量和成員函數。只要是須要指定變量或者函數的所屬,都會用到做用域運算符。

相關文章
相關標籤/搜索