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