目錄
一.C和C++的區別
二.輸入輸出流類
2.1輸出cout
2.2輸入cin
三.命名空間
2.1使用命名空間中的標識符
2.2命名空間中聲明函數
2.3命名沖突問題
2.4匿名空間
2.5命名空間添加,嵌套,重命名
四.字符串的使用
4.1string類
4.2C風格和C++風格字符串的轉化
4.3string類中常用的函數
五.bool類型
六思維導圖/練習
一.C和C++的區別
i)頭文件的區別
C++中的頭文件一般沒有.h,C++對C語法做了兼容
所以C中的頭文件,仍然可以在C++文件中使用,一般去掉C中頭文件的.h,在前面加上c
例: stdio.h ----> cstdio
ii)拓展名的區別
C語言:.c ----->使用gcc編譯器
C++: .cpp , .C ------>使用g++編譯器,g++比gcc編譯器語法更加嚴格(主函數的返回值類型不能修改)
iii)語法區別(語法的擴充)
- 命名空間
- 函數重載(一名多用)
- 字符串的使用(string類型)
- 引用(和C中的指針類似)
- 面向對象的特征(封裝、繼承和多態) C++是面向對象語言
- STL標準模板庫(前面C寫的所有數據結構C++中可以直接使用)
- 模板編程
- 智能指針(C++11開始的新特性)
- lambda表達式
二.輸入輸出流類
2.1輸出cout
1)cout的基本使用
cout是ostream類提供的類對象,printf()是C庫中的函數
cout可以實現級聯的輸出(連續輸出多個)
如果使用cout,需要導入頭文件,引入命名空間std
cout << a << endl;
2)cout控制格式的輸出
通過關鍵字控制輸出格式,或者通過函數控制輸出格式 #include
setbase(); 控制進制輸出
setw(); 控制寬度輸出 ---->left關鍵字
setprecison(); 控制包含小數點位數輸出
2.2輸入cin
是istream輸入流提供的類對象
在istream中對>>運算符進行了運算符重載,>>變成輸入運算符
仍然不需要格式符,會根據類型自動推導
cin >> a;
三.命名空間
在C++中,命名空間(Namespace)是一種避免命名沖突的方式,它可以把一組具有相似功能的實體(包括類、函數、變量等)封裝在一起,形成一個獨立的區域。命名空間可以有效地防止在大型程序中因命名重復而導致的沖突問題。
namespace 命名空間名 { //標識符(變量名、函數名、類型名) }
2.1使用命名空間中的標識符
定義在命名空間中的標識符,不能直接使用,需要導入后再使用
i)全局導入命名空間
using namespace 命名空間名; ---->該語句表示,導入命名空間中的所有標識符,在該語句后面,命名空間中的所有標識符可以任意使用(一般寫在頭文件下方,主函數上方)
ii)局部導入命名空間中標識符
:: ----->域限定符
在哪里使用標識符,就在哪個位置導入標識符
std::cout << "hello" << std::endl; //只在使用cout的位置導入標識符std
iii)導入命名空間中的部分標識符
使用using 命名空間名::標識符名; ----->在該語句后,可以使用導入的指定標識符
2.2命名空間中聲明函數
在命名空間中聲明函數,在命名空間外定義函數,需要在函數名前加上命名空間名::函數名
namespace Test {//存放標識符//定義變量int num = 100;//定義結構體類型struct Stu{int age;};//聲明函數void show(); }//定義命名空間中的show()函數 void Test::show() {cout << "hello" << std::endl; }
2.3命名沖突問題
何時發生命名沖突,當同時可以訪問到兩個同名標識符時發生命名沖突
i)命名空間和局部變量沖突
如果不導入命名空間,不會發生沖突
即使導入了命名空間,默認訪問局部變量,也不發生訪問的沖突
如果導入命名空間后,想要訪問命名空間中的標識符,在標識符前加上命名空間名::
ii)命名空間和全局變量沖突
如果不導入命名空間中的標識符,不會發生沖突,直接訪問全局變量
導入命名空間中標識符后發生沖突:
- 訪問命名空間中的標識符: 命名空間名::標識符名
- 訪問全局變量: ::標示符名(訪問全局變量)iii)兩個命名空間中的標識符沖突
iii)兩個命名空間中的標識符沖突
必須是在同時導入了兩個命名空間時才會發生標識符沖突問題
解決方式: 命名空間名::標識符 ----->直接指定訪問某一個命名空間中的標識符
2.4匿名空間
沒有名字的命名空間就叫做匿名空間
namespace { //標識符 }
匿名空間中的標識符,無需使用using導入,也可以訪問
如果發生命名沖突,可以使用 ::標識符名,來訪問匿名空間中的標識符
如果存在命名空間和匿名空間標識符沖突的情況,(盡量不要導入有名字的命名空間中的標識符)
如果匿名空間和全局變量沖突 ::標識符名(默認訪問全局變量)
2.5命名空間添加,嵌套,重命名
1)命名空間的添加
如果定義了同名的命名空間,會自動合并成同一個命名空間
(將后續定義的內容添加到原有的命名空間中)
2)命名空間的嵌套
存在嵌套命名空間時,只需要根據定義順序,通過域限定符一層一層訪問下去即可
3)命名空間的重命名
格式
namespace 新名字 = 舊名字;
四.字符串的使用
4.1string類
string類
是C++中封裝好的一個類(可以理解為是一種數據類型)
定義字符串:string 變量名;
#include <iostream> using namespace std; int main() {string s1; //定義了一個字符串變量s1string s2 = "hello"; //定義了一個字符串變量s2使用hello初始化cout << "s1 = " << s1 << endl;cout << "s2 = " << s2 << endl;string s3(5,'a'); //定義了一個字符串變量s3使用5個a進行初始化cout << "s3 = " << s3 << endl;string s4("hi"); //定義了一個字符串變量s4使用hi字符串初始化cout << "s4 = " << s4 << endl;string s5 = s4; //定義了一個字符串變量s5使用s4初始化cout << "s5 = " << s5 << endl;cout << s3+s2 << endl; //stringl類對象,可以直接通過運算符完成拼接return 0; }
4.2C風格和C++風格字符串的轉化
C風格的字符串可以直接轉換成C++風格
C++風格的字符串,不能直接轉換成C風格的字符串,需要借助于特殊的函數
data(),c_str(); //這兩個函數的返回值,都是char*類型的指針
#include <iostream> #include <cstring> using namespace std;int main() {string s1 = "a"; //定義了一個字符串變量s1string s2 = "hello"; //定義了一個字符串變量s2使用hello初始化cout << "s1 = " << s1 << endl;cout << "s2 = " << s2 << endl;cout << strcmp(s1.data(),s2.c_str()) << endl;return 0; }
4.3string類中常用的函數
i)at()
按位置訪問字符串
使用at訪問字符串時超出字符串范圍代碼會拋出異常
#include <iostream> using namespace std; int main() {string s1 = "abcdefg";cout << s1[0] << endl; //通過下標的方式訪問字符串中的字符cout << s1[100] << endl;cout << s1.at(100) << endl; //直接代碼拋出異常,不繼續向后執行cout << s1.at(0) << endl; //不會輸出return 0; }
ii)empty()/clear()
empty():判斷字符串是否為空
clear():清空字符串
iii)? length()/size()
求字符串的長度
輸入字符串
getline()的兩個參數,第一個參數是輸入流對象,第二個參數輸入的字符串變量
string s1; getline(cin,s1);
五.bool類型
常用在函數的返回值
- C語言中不直接支持bool類型,但是C++中直接支持bool類型,結果是一個邏輯值
非0即1,true和false
- bool類型的變量可以使用true和false賦值,也可以使用數值賦值
- cout輸出時,默認使用數字表示法輸出bool類型的值
- 如果想要使用單詞輸出bool類型的值,在輸出時加上boolalpha,想要恢復數字表示法加上noboolalpha
- bool類型的大小1Byte,因為計算機分配內存的基本單位是字節
#include <iostream> using namespace std;int main() {bool t = 0.01;cout << t << endl;cout << boolalpha << t << endl; //truecout << noboolalpha << t << endl; //1 cout << sizeof(t) << endl; //1Bytereturn 0; }