C++ 从入门到入土 #1
目錄
目錄
前言
C++和C語言的不同
?文件后綴
?C語言是面向過程編程,C++則是面向對象編程
?頭文件
??新增命名空間
??輸入輸出
補充:輸入時需要注意的
??新的數據類型
補充:關于C++中的const
??空指針的聲明
??函數思想
參考資料:
前言
?學習C++之前 建議先學習C語言的知識。因為C++看似很多功能,都是用C語言來實現的。
熟練C語言之后對C++的學習有很大助力,并且某些硬件比如 Arduion 也是由C語言進行控制的。
作為計算機專業的學生,在大一開始也是從C語言入門的。但是學校并沒有C++的課程。
想系統學習C++的我,機緣巧合之下報了頓開教育的C++全棧課程。沒想到也是由C語言先開始教學,再進入C++。
C++和C語言的不同
學習C++之前,先了解一下C++與C語言的不同之處。
?文件后綴
????????C語言源文件的后綴為.c,C++源文件的后綴為.cpp
?C語言是面向過程編程,C++則是面向對象編程
?頭文件
????????1.包含自己的頭文件時不變
#include "xxx.h"? ? ? ? 2.包含C語言標準庫時的兩種方法
#include <stdio.h> 保持原來方法不變 #include <cstdio> 去掉“.h ”在最前加上“c”? ? ? ? 3.包含C++標準庫時不需要“.h”
#include <iostream> C++標準輸入輸出頭文件(Input/Output Stream)??新增命名空間
在C語言中同一個作用域下不允許定義相同標識符(變量名,函數名等)
而C++中引入了命名空間之后可以重復使用同一標識符,從而增加了標識符的使用率
#include <stdio.h>基本創建空間方法 namespace NameList1{int varA=1;void print(){printf("variable in NameList1:%d\n",varA);} }namespace NameList2{int varA=1;void print(){printf("variable in NameList2:%d\n",varA);}}?通過上面的代碼就可以通過不同的空間創建擁有相同名字的變量和函數了(叫空間中的成員或空間中的數據)
并且可以通過作用域分辨符“::”來使用他們
#include <stdio.h>//基本創建空間方法 namespace NameList1 {int varA;void print() {printf("variable in NameList1:%d\n", varA);} }namespace NameList2 {int varA=2;void print() {printf("variable in NameList2:%d\n", varA);}}int main() {NameList1::varA = 1;NameList1::print();NameList2::print();return 0; }?輸出:
variable in NameList1:1
variable in NameList2:2
如此可見,名字雖然相同,但是所在的空間不同。可以通過?作用域分辨符“::”來區分并訪問它們。
而作用域分辨符“::”還有另一個作用就是可以區分全局變量。
#include <stdio.h>int Var = 2;int main() {int Var = 1;printf("%d\n", Var);printf("%d\n",::Var);return 0; }??輸出:
1
2
?并且可以知道,在沒有作用域分辨符“::”的時候,輸出變量時采用就近原則。
另外,可以通過“using namespace”來指定某個空間名從而省略使用作用域分辨符
... int main() {using namespace NameList1;printf("%d\n", varA);return 0; }但是使用兩次?“using namespace”來指定兩個不同空間名時會出現二義性問題,導致程序報錯。
因為“using namespace”的作用域為此代碼開始到所在函數結束,并不會被第二個“using namespace”斷開。
錯誤代碼:
... int main() {using namespace NameList1;printf("%d\n", varA);using namespace NameList2;printf("%d\n", varA);return 0; } 錯誤代碼此時需要用?作用域分辨符“::” 來進行區分來避免二義性
正確代碼:
... int main() {using namespace NameList1;printf("%d\n", varA);printf("%d\n", NameList2::varA);return 0; } 正確代碼?此外,命名規則還能進行嵌套(剝洋蔥)
... namespace A {int aa = 10;namespace B {int bb = 100;} }int main() {printf("%d\n", A::aa);printf("%d\n", A::B::bb);using namespace A::B;printf("%d\n", bb);using namespace A;printf("%d\n", aa);printf("%d\n", B::bb);printf("%d\n", bb);return 0; }??輸出:
10
100
100
10
100
100
??輸入輸出
使用<iostream>庫,cout進行輸出,cin進行輸入,使用位運算符“<<” ”>>”進行連接,不需要像C語言那樣輸入格式指定字符。
而需要強制類型轉換時只需在變量名前加上括號或者給變量名加上括號進行。
"ednl" 用來進行換行?
#include <iostream>int main(){using namespace std;cout << "ILoveyou\n";char str[] = "ILoveyou\n";cout << str;int a = 1;float b = 1.1;cout << a;cout << b;cout << "\n";cout << a << "\t" << (int)b << "\n";cout << a << "\t" << int(b) << "\n";//即使是輸入用變量也要有初始化的習慣int iNum = 0;float fNum = 0.0f;//unsigned int uNum = 1u;//long int lNum = 1L;cout << "請輸入一個整數,一個浮點數,一個字符串:";cin >> iNum >> fNum >> str;cout << iNum << "\t" << fNum << "\t" << str << endl;return 0; }在開頭一遍會輸入“using namespace std” ,因為cout 和 cin 在常用庫內的命名空間std里有定義。
如果不使用,則需要 std::cout 和 std::cin 來訪問
補充:輸入時需要注意的
c++的“cin”和c的“sacnf”一樣,會判斷輸入緩存區中是否有空格,空格為輸入數據讀取的結束。
接受空格的輸入:
char str[10]=""; //C gets_s(str,10);//C++ cin.getline(str,10); cout.write(str,10);另外緩沖區可以通過
while(getchar()!=\n);來清除
??新的數據類型
bool類型:占用一個字節
? ? ? ? ? ? ? ? ? 非零表示成立,0或者指針空表示不成立
#include <iostream> using namespace std; void testBool() {bool bNum = 1234;cout << bNum << endl;bNum = -1;cout << bNum << endl;bNum = false;cout << bNum << endl;bNum = true;cout << bNum << endl;//boolalpha 用true和false方式打印bool類型cout << boolalpha << bNum << endl; }??輸出:
1
1
0
1
true
引用類型:給變量起別名,可以通過別名直接調用原變量
... int main() {int A = 1;int B = 2;int& quoteA = A;int& quoteB = B;cout << quoteA << quoteB << endl; }常見用法,兩數交換時可以不用像麻煩的指針那樣進行操作,形參變成了實參,可以直接對其進行更改
... void swap(int& quoteA, int& quoteB) {int c = quoteA;quoteA = quoteB;quoteB = c; }int main() {int A = 1;int B = 2;cout << A << B << endl;swap(A, B);cout << A << B << endl; }輸出:
12
21
?常引用:需要const修飾,引用時無法通過別名對被引用對象進行修改
右值引用: 提供一個修改常量的接口(例如輸入本金得到利息的計算結果)? ? ? ? ? ??
... void printRightValue(int&& a){a+=11;cout<<a<<endl; }int main(){printRightValue(11);return 0; }? 常引用和右值引用的區別:右值引用不能給左值起別名?
int aa=1;const int& x=aa; int&& xx=aa;//錯誤?引用的用處
????????函數參數(防止拷貝產生)
????????函數返回值(增加左值使用),一般返回全局變量的引用,無法返回局部變量
?auto類型:根據賦值的數據,自動推斷其類型(需要賦值)
與C語言auto的區別:在C++中淘汰了C語言的用法,只有自動推斷用法
補充:關于C++中的const
字符串常量傳遞給函數時,形參必須用const修飾
常量起別名時需要const來修飾
??空指針的聲明
nullptr 而不是 NULL,其實都可以,但是建議用nullptr
int* p = nullptr; char* pc = NULL;??函數思想
內聯函數:
????????inline,短小精悍的函數可以為內聯函數
inline int Max(int a,int b){return a>b ? a : b; }? ? ? ? ?在結構體中或者類中實現的函數默認內聯
函數重載:
????????C++允許同名不同參數函數存在
? ? ? ? 不同參數的定義:參數數目不同,參數類型不同,參數順序不同(前提類型不同)
void print(int a) //算 {cout << a << endl; }void print(int a, int b) //算 {cout << a + b << endl; }void print(int b, int a) //不算 {cout << a + b << endl; }void print(int a, char b) //算 {cout << "int,char" << endl;cout << a + b << endl; }void print(char a, int b) //算 {cout << a + b << endl; }????????重載優先調用類型一致的函數,若沒有則優先左邊參數匹配
... void print(char a, int b); void print(int a, int b);int main() {print(1,'A');return 0; }void print(int a, int b) {cout << a + b << endl; }void print(char a, int b) {cout << "char,int" << endl;cout << a + b << endl; }輸出:?
?66
函數缺省:(重載的綜合寫法)
????????C++中允許給函數形參初始化
????????缺省順序 必須從右往左缺省,缺省的參數中間不能存在沒有缺省的
????????沒有傳入參數,使用的是默認值
? ? ? ? 傳入參數必須從左往右滿足
... void printData(int a=1, int b=2, int c=3, int d=4) {cout << a + b + c + d << endl; }int main() {printData(); //a=1 b=2 c=3 d=4printData(10); //a=10 b=2 c=3 d=4printData(10, 20); //a=10 b=20 c=3 d=4printData(10, 20, 30); //a=10 b=20 c=30 d=4 printData(10, 20, 30, 40);//a=10 b=20 c=3 d=40return 0; }輸出:?
10
19
37
64
100
疑惑點:
常引用的本質是什么
參考資料:
基于 頓開教育 莫影老師 C++課程第一課 筆記整理
總結
以上是生活随笔為你收集整理的C++ 从入门到入土 #1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7原版镜像_U盘安装原版Windo
- 下一篇: visual c++ 下载地址