C++基礎語法
C++基于C語言的改進:c++在C語言的基礎上引入并擴充了面向對象的概念
C++基礎概念:C++是基于C語言而產生的,它即可以進行C語言的過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行面向對象的程序設計
在1998年 出現C++98 C++成熟 他是標準第一個版本 引入了STL 標準模板庫
C++總共63個關鍵字,其中包括C語言關鍵字32個
1.命名空間
在C/C++中,變量、函數和后面要學到的類都是大量存在的,這些變量、函數和類的名稱將都存在于全局作用域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染,namespace關鍵字的出現就是針對這種問題的。
這是C語言一個缺點:
例如:
//使用rand定義一個全局變量 沒有問題 輸出0
int rand = 0;int main()
{printf("%d ", rand);return 0;
}
如果引用頭文件stdlib rand是個函數 導致命名沖突 編譯失敗
假如:日常你使用一個變量名稱 你不知道他是庫函數中的函數 那么會導致命名沖突
命名空間用來做名字隔離 防止命名沖突
如果沒有命名空間 如果名字沖突了 整個項目上千個名字 改起來很麻煩
如果以后去公司 分組完成一個項目 單獨寫都沒有問題 很多小組難免會命名沖突,我們該如何避免這種狀況
如果是C語言的話 只能商量一下 兩個人其中的一個人被迫修改名字
但是C++有方式解決方式,引入命名空間 新增關鍵字 namespace
命名空間的定義
定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名
普通的命名空間:
例如:
#include <iostream>
namespace zhr
{int a = 0;
}
namespace后面可以定義一個名字 這個名字就是域
命名空間定義的是命名空間域
命名空間域的變量生命周期是全局,但是它屬于該命名空間域
C語言早早就接觸過 同一個域不可以定義同一個變量 不同的域可以定義相同的變量
域會影響訪問和生命周期
: :? 域作用限定符 指定從域作用限定符左邊的域去找 如果左邊的域是空白 表示全局域 去全局域找
#include <stdio.h>
namespace bit
{int a = 2;
}
int a = 1;
int main()
{int a = 0;printf("%d\n",a);//在局部范圍找 輸出結果是0printf("%d\n", bit::a);//指定命名空間域去找 輸出結果是2//如果非要訪問全局變量中的a呢? printf("%d\n",::a);//域作用限定符; 輸出結果是1return 0;
}
會輸出局部變量的a 局部優先 就近原則 像訪問局部 局部沒有 再去全局變量中找
命名空間不只是可以定義變量 還可以定義函數 結構體
直接調用調用不到函數 命名空間是函數找的規則 默認在全局變量去找 默認不會在命名空間去找 必須指定才會去找
namespace bit
{int rand = 0;void func(){printf("func()\n");n }struct TreeNode{struct TreeNode* left;struct TreeNode* right;int val;};
}int main()
{func();//直接調用是調用不到的bit::func();//只需要在func前加bit::就可以調用到了struct TreeNode node;//這里也同理struct bit::TreeNode node;//但是這里命名空間要放在結構體名稱前面return 0;
}
命名空間可以嵌套
#include <iostream>namespace hhh
{namespace zhr{int a = 10086; }
}
int main()
{printf("%d\n",hhh::zhr::a);return 0;
}
3. 同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中
注意:一個命名空間就定義了一個新的作用域,命名空間中的所有內容都局限于該命名空間中
不可以直接調用該命名空間里的變量和函數 需要使用:: 域作用限定符
命名空間的使用有三種方式:
1.加命名空間名稱及作用域限定符:
using namespace std;
namespace N
{int a = 886;int b = 0;
}
int main()
{printf("%d\n", N::a);return 0;
}
2.使用using將命名空間中成員引入
using namespace std;
namespace N
{int a = 886;int b = 520;
}
using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0;
}
3.使用using namespace 命名空間名稱引入
using namespace std;namespace N
{int a = 886;int b = 520;int c = 666;
}
using namespace N;using N::b;
int main()
{printf("%d\n", a);printf("%d\n", b);printf("%d\n", c);return 0;
}
使用命名空間的建議
1.項目中盡量不用using namespace std;
std是標準庫的命名空間
2.日常練習用using namespace std;
3.項目中,指定命名空間訪問+展開常用的
2.C++輸入&輸出
C++的第一個代碼:hello World
知道了命名空間 這回知道了每次寫C++代碼前都要加
using namespace std;std是C++標準庫的命名空間
如果直接展開std 會把庫全部暴露出來 在項目中不適用
1.使用cout標準輸出(控制臺)和cin標準輸入(鍵盤)時,必須包含< iostream >頭文件以及std標準命名空間。
注意:早期標準庫將所有功能在全局域中實現,聲明在.h后綴的頭文件中,使用時只需包含對應頭文件即可,后來將其實現在std命名空間下,為了和C頭文件區分,也為了正確使用命名空間,規定C++頭文件不帶.h;舊編譯器(vc 6.0)中還支格式,后續編譯器已不支持,因此推薦使用+std的方式。
2. 使用C++輸入輸出更方便,不需增加數據格式控制,比如:整形--%d,字符--%c
#include <iosream>using namespace std;//std是C++標準庫的命名空間
int main()
{int i, d;cin >> i >> d; //流提取cout << "Hello World" << endl;// endl是換行 相當于'\n';cout << i << ' ' << d << endl;//這里的<<是流插入 自動識別類型cout << "hello world" << endl; //這里相當于把一個char數組流插入到控制臺 return 0;
}
個人水平不足 如果代碼中有錯誤,可以多多在評論區指出,一定會及時修改!
謝謝大家看到這里 覺得有收獲的話可以三連一下 一起加油!