日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ 从入门到入土 #1

發(fā)布時(shí)間:2024/3/26 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 从入门到入土 #1 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

目錄

前言

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。