c++ primer學習筆記(一)

目錄

第一章、c++快速入門

重點:類的簡介

第二章

1、基本內置類型

2、字面值常量

1、整型字面值規則

2、浮點字面值規則

3、布爾字面值

4、字符字面值

5、非打印字符的轉義序列

?編輯

6、字符串字面值

3、變量

1、變量標識符

?2、定義和初始化對象

3、變量初始化規則

4、聲明和定義

5、名字的作用域

4、const限定符

5、引用

6、typedef 名字

7、枚舉

8、類類型

9、編寫自己的頭文件


第一章、c++快速入門

1、注釋對不能嵌套!!!若想注釋掉某行代碼用單行注釋!!

2、定義在for循環中的變量在退出for循環后不能再訪問。如下var

int m;
for(int var=0;var<10;var++)
{m+=var;
}
printf("%d\n",m);  //m可以訪問,var不可訪問

3、windows系統下通過鍵入Ctrl+z來輸入文件結束符。例如下:

int var,sum;
while(std::cin>>var)
{sum++;
}

輸入Ctrl+z時程序會終止循環。

重點:類的簡介

1、類可以是系統自帶的,比如iostream,也可以自定義。引用方式不同,如下

#include <iostream>
#include "Sales_item"  //自定義類用雙引號

2、每個類定義一種類型,類里面還有對象和成員函數(也叫類方法)等。如下:

int main()
{Sales_item item1,item2;std::cin>>item1>>item2;if(item1.same_isbn(item2)) //以.的方式引用成員函數{std::cout<<item1+item2<<std::endl;//兩個對象可以相加,具體要看Sales_item頭文件里讓相加做什么}return 0;
}

第二章

1、基本內置類型

1、wchar_t類型用于擴展字符集,如漢字和日語等。

2、存儲方式:通常將8位的塊作為一個字節。32位或4個字節作為一個字(word)。

3、帶符號類型可以表示正數、負數、0。? 無符號類型只能表示正數和0。

4、一個使用一位符號位的表示方式為8位的signed整型取值是從-128到127。

5、c++中,把負值賦給unsigned對象是完全合法的,其結果是該負數對該類型的取值個數求模后的值。(如-1賦給8位unsigned char結果是255,即-1對256求模)

6、long類型運行時代價遠遠高于用int類型進行同樣計算的代價。

7、float類型中隱式的精度損失不能忽視,但double計算的代價相對于float可以忽略。

2、字面值常量

只有內置類型存在字面值,沒有類類型的字面值。因此也沒有任何標準庫類型的字面值。

1、整型字面值規則

1、以0開頭的字面值整數常量表示八進制,以0x或0X開頭的表示十六進制。

2、在數值后面加L指定常量為long類型。在數值后面加U或u定義unsigned類型。同時加L和U得到unsigned long類型的字面值常量(注意后綴不能有空格!!)。沒有short型的字面值常量。

128u //unsigned
1L  //long
1024UL  //unsigned long
8LU  //unsigned long (U和L誰在前都可)

2、浮點字面值規則

默認的浮點字面值常量為double類型。在數值后加上F或f表示單精度。加上L表示擴展精度。

3.14159F  //每組表示的數值相同
3.14159E0f.001f
1E-3F12.345L
1.2345E1L0.
0e0

3、布爾字面值

true和false

bool test=false;

4、字符字面值

在字符字面值前面加L能得到wchar_t類型的寬字符字面值。

'a'
L'a'

5、非打印字符的轉義序列

可以用八進制和十六進制轉義字符來定義任何字符

6、字符串字面值

1、“A”是包含字母A和空字符‘\0’兩個字符的字符串。

2、寬字符字面值是一串常量寬字符,以一個寬空字符結束。

L"a wide string literal"

3、字符串字面值的連接

法(1)、兩個相鄰的僅由空格、制表符或換行符分開的字符串字面值(或寬字符串字面值),可連接成一個新字符串字面值。這樣可以多行書寫長字符串字面值。

std::cout<<"apple banana "  //末尾留空格/*后繼行行首隨便空格或者制表符,不算入字符串內部*/  "pear grape ""orange strawberry"<<std::endl;輸出:apple banana pear grape orange strawberry 

法(2)、 多行字面值也可以處理長字符串。

在一行的末尾加一個反斜線符號可將此行和下一行當做同一行處理。

std::cou\
t<<"hello"<<st\
d::endl;相當于std::cout<<"hello"<<std::endl;
std::cout<<"apple banana \
pear grape \
orange strawberry"<<std::endl;輸出:apple banana pear grape orange strawberry 

注意反斜線符號必須是該行的尾字符,不允許其后面有注釋空格!!!

采用\處理多行字面值時,后繼行行首的任何空格和制表符都是字符串字面值的一部分。因此,長字符串字面值的后繼行不能有縮進(除非上一行行尾還沒縮進完)。

3、變量

對象就是內存中具有類型的區域。

1、變量標識符

關鍵字不能用作變量的標識符。如下:

?下面這張僅做了解。

注:以下標識符是可以的

Float
_

?2、定義和初始化對象

對象初始化可以用復制初始化(=)或直接初始化(括號)

int var=1024;
int var(1024);

直接初始化的語法更靈活且效率更高。

注:初始化不是賦值!!初始化指創建變量并給它賦初始值,而賦值則是擦除對象的當前值并用新值代替。

對內置類型來說,復制初始化和直接初始化幾乎沒有差別。

對類類型的對象來說,有些初始化僅能用直接初始化完成。定義如何進行初始化的成員函數稱為構造函數。

#include <string>
std::string titleA="c++ primer,4th ed.";
std::string titleB("c++ primer,4th ed.");std::string all_nines(10,'9');
//all_nines="9999999999"
//這種初始化方式也是直接初始化,有多個初始化式(初始化值可變)時不能用復制初始化。

可以用同一個定義中前面已定義的值初始化后面的變量。

double salary=9999.99,wage(salary+0.01);

3、變量初始化規則

1、內置類型變量的初始化

在函數體外定義的變量都初始化成0,在函數體內定義的內置類型變量不進行自動初始化。

2、類類型變量的初始化

如果類具有默認構造函數,那么就可以在定義該類的變量時不用顯示地初始化變量。

#include <iostream>
#include <string>
int main()
{std::string empty;  //定義了一個名為empty的字符串變量,并且不進行初始化std::cout<<empty<<std::endl;  //輸出" "(空字符),string類型默認初始化為空
}

有些類類型沒有默認構造函數,那么每個定義都必須提供顯示的初始化式,沒有初始值根本不可能定義這種類型的變量。

4、聲明和定義

1、定義:用于為變量分配存儲空間,指定初始值。

2、聲明:用于向程序表明變量的類型和名字。不分配存儲空間!!

定義也是聲明!!

3、可以通過extern關鍵字聲明變量而不定義它。

extern int i;  //聲明但不定義
int i;  //定義

注:一個變量只能定義一次!!但可以聲明多次!!

4、當extern聲明位于函數外部時,才可以含有初始化式。如果聲明有初始化式,那么該聲明也是定義。

extern double pi=3.14159;  //聲明的同時定義

5、任何在多個文件中使用的變量都需要有與定義分離的聲明。

5、名字的作用域

1、全局作用域:定義在所有函數外部的名字

2、局部作用域:函數內的名字

3、語句作用域:定義在如for語句內

int add=0;  //全局作用域
int main()
{int sum=0;  //局部作用域for(int i=0;i<10;i++)  //語句作用域{sum++;}
}

作用范圍:全局>局部>語句

若小作用域中某變量的名字和大作用域中某變量名字相同,則當運行到小作用域時,會屏蔽大作用域中對該變量的賦值或操作。

最好在使用變量時定義它,不要全都定義在開頭。

4、const限定符

常量在定義之后不能被修改,所以定義時必須初始化。

在全局作用域聲明的const變量是定義該對象的文件的局部變量。此變量只存在于那個文件中,不能被其他文件訪問。

通過指定const變量為extern,就可以在整個程序中訪問const對象。

//file_1.cpp
extern const int buf=fcn();  //文件1中定義//file_2.cpp
extern const int buf;   //文件2中聲明并使用
for(int index=0;index!=buf;++index)
{//……
}

非const變量默認為extern。要使const變量能夠在其他文件中訪問,必須顯示地指定它為extern。

int cnt=0;
const int sz=cnt; //合法

5、引用

引用是對象的另一個名字。主要作為函數的形參。

引用必須用與該引用同類型的對象初始化。

int ival=1024;
int &refval=ival; //合法
int &refval2;  //不合法,引用必須初始化
int &refval3=10;   //不合法,引用的右值必須是對象

作用在引用上的所有操作事實上都作用在該引用綁定的對象上。

當引用初始化后,只要該引用存在,它就保持綁定到初始化時指向的對象。不可能將引用綁定到另一個對象。

const引用:指向const對象的引用

const int ival=1024;
const int &refval=ival;
int &ref2=ival;  //不合法,不是const引用

非const引用只能綁定到與該引用同類型的對象。

const引用可以綁定到不同但相關的類型的對象或綁定到右值。

double dval=3.14;
const int &ri=dval;
//編譯器會轉化為以下代碼
int temp=dval;
const int &ri=temp;

6、typedef 名字

typedef double wages;
typedef wages salary;
typedef int exam_score;

7、枚舉

1、定義和默認賦值

enum Forms {shape=1,sphere,cylinder,polygon}; //默認逐個+1
//sphere=2, cylinder=3, polygon=4
enum Points {point2d = 2, point2w, point3d = 3, point3w };//在前一個基礎上+1
//point2w=3, point3w=4

?2、枚舉類型的對象的初始化或賦值,只能通過其枚舉成員或同一枚舉類型的其他對象來進行。

Points pt3d = point3d; //√,point3d是Points的枚舉成員
Points pt2w = 3; //×
pt2w = polygon;  //×
pt2w = pt3d; //√,pt3d和pt2w都是同一個枚舉類型的枚舉成員

8、類類型

1、從操作接口設計類。每個類都定義了一個接口和一個實現。

?定義類時,通常先定義該類的接口,即該類所提供的操作。通過這些操作,可以決定該類完成? ? ?其功能所需要的數據和函數。

2、一般不能把類成員的初始化作為其定義的一部分。定義數據成員時,只能指定該數據成員的名字和類型。

3、c++中定義類類型除了關鍵字class以外,還支持另一個關鍵字struct(從C語言繼承過來的)

用class和struct關鍵字定義類的唯一差別在于默認訪問級別。默認情況下,struct的成員為public,而class的成員為private

9、編寫自己的頭文件

為了允許把程序分成獨立的邏輯塊,c++支持分別編譯

1、頭文件一般包括類的定義、extern變量的聲明和函數的聲明。

2、正確使用頭文件的好處:(1)保證所有文件使用給定實體的同一聲明

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)當聲明需要修改時,只有頭文件需要更新

3、頭文件用于聲明而不是定義

? ? ? 定義只可以出現一次,聲明可以出現多次

extern int ival = 10;  //雖然有 extern,但有初始化式,是定義
double fic;  //雖然沒有初始化式,但也沒有extern,所以也是定義

同一個程序中有兩個以上文件含有上述任意一個定義都會導致多重定義鏈接錯誤。

?又因為頭文件包含在多個源文件中,所以頭文件不應該含有變量或函數的定義。

對于上述規定,有三個例外。頭文件可以定義類、值在編譯時就知道的const對象和inline函數

(const變量和它的初始化式必須是每個文件都可見的。而要使初始化式可見,一般都把這樣的const變量定義在頭文件中)

但如果const變量不是用常量表達式初始化,那么它就不應該在頭文件中定義。應該在一個源文件中定義并初始化,并在頭文件里為它加上extern聲明。

4、預處理器

(1)頭文件中有可能會引用其他頭文件,所以源文件對于某個頭文件可能會直接引用一次又間接引用一次。

因此設計頭文件時應使其可以多次包含在同一源文件中。保證多次包含同一頭文件不會引起該頭文件定義的類和對象被多次定義。

頭文件保護符可以避免在已經見到頭文件的情況下重新處理該頭文件的內容。

(2)避免多重包含:

為避免名字沖突,預處理器變量通常用大寫字母表示

預處理器有兩種狀態:已定義或未定義。

#define 表示定義預處理器變量? ?#ifndef 表示檢測指定的預處理器變量是否未定義

如果預處理器變量未定義,那么跟在其后的所有指示都被處理,直到出現#endif

例:

#ifndef SALES
#define SALES
//Defination of class
#endif

若SALES預處理器變量未定義,#ifndef測試成功,跟在#ifndef后面的所有行都被執行,直到#endif

若SALES預處理器變量已定義,#ifndef測試為假,#ifndef到#endif的部分都會被忽略

(3)自定義頭文件

#include <xxx> 標準頭文件? ? ? ?#include “xxx” 自定義頭文件??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716586.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716586.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode 1328.破壞回文串

題目鏈接LeetCode1328 1.題目 給你一個由小寫英文字母組成的回文字符串 palindrome &#xff0c;請你將其中 一個 字符用任意小寫英文字母替換&#xff0c;使得結果字符串的 字典序最小 &#xff0c;且 不是 回文串。 請你返回結果字符串。如果無法做到&#xff0c;則返回一個…

java: 無法訪問org.springframework.web.bind.annotation.RequestMapping......類文件具有錯誤的版本 61.0, 應為 52.0

文章目錄 一、報錯問題二、問題背景三、原因分析四、解決方案 一、報錯問題 java: 無法訪問org.springframework.web.bind.annotation.RequestMapping 錯誤的類文件: /D:/SoftwareInstall/Maven/repository/org/springframework/spring-web/6.0.9/spring-web-6.0.9.jar!/org/s…

latex報錯Repeated entry解決辦法

報錯原因——重復了兩個參考文獻&#xff0c;刪掉一個即可 總結 "Repeated entry"這個錯誤通常出現在你嘗試在LaTeX中多次使用同一個標簽&#xff08;label&#xff09;或者多次插入相同的圖像/表格等時。例如&#xff0c;在LaTeX中&#xff0c;我們可能會為每一個章…

Modern C++ std::any為何要求Tp可拷貝構造?

小問題也會影響設計的思路&#xff0c;某個問題或某種case的探討有助于理解設計的初衷。 聲明&#xff1a;以下_Tp/Tp都是指要放入std::any的對象的類型。 它要求_Tp is_copy_constructible, 僅僅是因為有很多函數的實現調用了Tp的拷貝構造函數嗎&#xff1f;比如說上節提到的初…

動態SQL的處理

學習視頻&#xff1a;3001 動態SQL中的元素_嗶哩嗶哩_bilibili 目錄 1.1為什么學 1.2動態SQL中的元素 條件查詢操作 if 元素 choose、when、otherwise元素 where、trim元素 更新操作 set元素使用場景 復雜查詢操作 foreach 元素中的屬性 ?編輯 迭代數組 迭代List 迭代Map 1…

代碼隨想錄算法訓練營第二十七天|LeetCode93 復原IP地址、LeetCode78 子集、LeetCode90 子集II

93.復原IP地址 思路&#xff1a;要建立一個判斷子字符串是否合法的函數&#xff0c;判斷多種不合法的情況。在回溯函數中&#xff0c;參數除了s,和startindex還需要一個pointNum來記錄句點的數量&#xff0c;當句點的數量等于3時&#xff0c;判斷最后一個子串是否合法&#xf…

第3部分 原理篇2去中心化數字身份標識符(DID)(4)

3.2.3. DID解析 3.2.3.1. DID解析參與方 圖3-5 DID 解析過程 本聰老師&#xff1a;我們之前提到過&#xff0c;DID 解析過程是將 DID 轉換為對應的 DID 文檔。這樣做的目的是驗證 DID 所代表的主體的身份。那么解析過程會涉及哪些概念呢&#xff1f;我們看圖3-&#xff0c;DI…

端智能:面向手機計算環境的端云協同AI技術創新

近年來&#xff0c;隨著移動端設備軟硬件能力的進步&#xff0c;移動端的算力有了很大提升&#xff0c;同時面向移動端的機器學習框架和模型輕量化技術越來越成熟&#xff0c;端上的AI能力逐漸進入大眾視野&#xff0c;端智能在電商領域也開始逐步走向規模化應用。通過持續探索…

leetcode日記(35)跳躍游戲Ⅱ

想了一個晚上&#xff0c;第一個思路是用動態規劃&#xff0c;記錄走到每一個節點需要跳動的最小步數&#xff0c;大致方法是每走到一個節點就遍歷一下前面的全部節點&#xff0c;看看哪個節點可以一部跳到該節點&#xff0c;然后從中選取跳躍步數最小的節點&#xff0c;最后輸…

完美解決多個Echarts圖表自適應窗口、父容器寬高,并進行性能優化

場景 很多時候我們會在繪制echarts圖表時&#xff0c;使用以下方法監聽瀏覽器尺寸變化&#xff0c;讓圖表resize()完成自適應 window.addEventListener(resize, ()>{wordCloudChart.resize() })然后&#xff0c;這種自適應真的足夠周全嘛&#xff1f;有些時候&#xff0c;…

多元正態分布(Multivariate Normal Distribution)

多元正態分布&#xff08;Multivariate Normal Distribution&#xff09;&#xff0c;也稱為多變量高斯分布&#xff0c;是單變量正態分布&#xff08;高斯分布&#xff09;在多維空間中的推廣。它是描述位于多維空間中的隨機向量的分布情況的一種概率分布。多元正態分布在統計…

基于springboot+vue的城鎮保障性住房管理系統(前后端分離)

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

練習 3 Web [ACTF2020 新生賽]Upload

[ACTF2020 新生賽]Upload1 中間有上傳文件的地方&#xff0c;試一下一句話木馬 txt 不讓傳txt 另存為tlyjpg&#xff0c;木馬文件上傳成功 給出了存放目錄&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步嘗試改木馬文件后綴…

云片 3.1(日常實習)面經

1、什么時候開始學習的前端 2、平常通過哪些方式學習 3、遇到bug怎么解決的 4、元素水平居中 5、display有哪些屬性 6、align-items除了center還有哪些屬性 7、display:none和visibility:hidden區別 8、常用的計量單位有哪些 9、rem和em是相對什么的 10、vw和vh有了解…

從頭構建gpt2 基于Transformer

從頭構建gpt2 基于Transformer VX關注{曉理紫|小李子}&#xff0c;獲取技術推送信息&#xff0c;如感興趣&#xff0c;請轉發給有需要的同學&#xff0c;謝謝支持&#xff01;&#xff01; 如果你感覺對你有所幫助&#xff0c;請關注我。 源碼獲取 VX關注曉理紫并回復“chatgpt…

CSS 自測題

盒模型的寬度計算 默認為標準盒模型 box-sizing:content-box; offsetWidth (內容寬度內邊距 邊框)&#xff0c;無外邊距 答案 122px通過 box-sizing: border-box; 可切換為 IE盒模型 offsetWidth width 即 100px margin 縱向重疊 相鄰元素的 margin-top 和 margin-bottom 會發…

leetcode-簡單

448. 找到所有數組中消失的數字 硬解 時間O(n)&#xff0c;空間O(n) class Solution { public:vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int> result;vector<int> tem(nums.size()1, 0);for(int i: nums){tem[i] 1;}for…

Benchmark學習筆記

小記一篇Benchmark的學習筆記 1.什么是benchmark 在維基百科中&#xff0c;是這樣子講的 “As computer architecture advanced, it became more difficult to compare the performance of various computer systems simply by looking at their specifications.Therefore, te…

python標識符、變量和常量

一、保留字與標識符 1.1保留字 保留字是指python中被賦予特定意義的單詞&#xff0c;在開發程序時&#xff0c;不可以把這些保留字作為變量、函數、類、模塊和其它對象的名稱來使用。 比如&#xff1a;and、as、def、if、import、class、finally、with等 查詢這些關鍵字的方…

【LeetCode】升級打怪之路 Day 11 加餐:單調隊列

今日題目&#xff1a; 239. 滑動窗口最大值 | LeetCode 今天學習了單調隊列這種特殊的數據結構&#xff0c;思路很新穎&#xff0c;值得學習。 Problem&#xff1a;單調隊列 【必會】 與單調棧類似&#xff0c;單調隊列也是一種特殊的數據結構&#xff0c;它相比與普通的 que…