中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

C++·入門(mén)|準(zhǔn)備知識(shí)-創(chuàng)新互聯(lián)

在這里插入圖片描述
啊我摔倒了..有沒(méi)有人扶我起來(lái)學(xué)習(xí)....

成都創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供濂溪企業(yè)網(wǎng)站建設(shè),專(zhuān)注與做網(wǎng)站、網(wǎng)站建設(shè)、html5、小程序制作等業(yè)務(wù)。10年已為濂溪眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

👱個(gè)人主頁(yè): 《 C G o d 的 個(gè) 人 主 頁(yè) 》 \color{Darkorange}{《CGod的個(gè)人主頁(yè)》} 《CGod的個(gè)人主頁(yè)》交個(gè)朋友叭~
💒個(gè)人社區(qū): 《 編 程 成 神 技 術(shù) 交 流 社 區(qū) 》 \color{Darkorange}{《編程成神技術(shù)交流社區(qū)》} 《編程成神技術(shù)交流社區(qū)》加入我們,一起高效學(xué)習(xí),收割好Offer叭~
🌱刷題鏈接: 《 L e e t C o d e 》 \color{Darkorange}{《LeetCode》} 《LeetCode》快速成長(zhǎng)的渠道哦~


目錄
  • 前言
  • 一、C++關(guān)鍵字(C++98)
  • 二、命名空間
    • 2.1 命名空間定義
    • 2.2 命名空間使用
  • 三、C++輸入&輸出
  • 四、auto關(guān)鍵字(C++11)
    • 4.1 類(lèi)型別名思考
    • 4.2 auto簡(jiǎn)介
    • 4.3 auto的使用細(xì)則
    • 4.4 auto不能推導(dǎo)的場(chǎng)景
  • 五、基于范圍的for循環(huán)(C++11)
    • 5.1 范圍for的語(yǔ)法
    • 5.2 范圍for的使用條件
  • 六、指針空值nullptr(C++11)
    • 6.1 C++98中的指針空值


前言
  • 為了更好地入門(mén)C++,本文有必要擺上一桌宴前小菜開(kāi)開(kāi)胃!
  • C++是在C的基礎(chǔ)之上,容納進(jìn)去了面向?qū)ο缶幊趟枷?,并增加了許多有用的庫(kù),以及編程范式等。
  • 本章節(jié)主要目標(biāo):
    • 補(bǔ)充C語(yǔ)言語(yǔ)法的不足,以及C++是如何對(duì)C語(yǔ)言設(shè)計(jì)不合理的地方進(jìn)行優(yōu)化的,比如:作用域方面、IO方面、函數(shù)方面、指針?lè)矫?、宏方面?/li>
    • 為后續(xù)類(lèi)和對(duì)象學(xué)習(xí)打基礎(chǔ)
  • 本文涉及的知識(shí)點(diǎn)有:
    1. C++關(guān)鍵字
    2. 命名空間
    3. C++輸入&輸出
    4. auto關(guān)鍵字(C++11)
    5. 基于范圍的for循環(huán)(C++11)
    6. 指針空值—nullptr(C++11)

一、C++關(guān)鍵字(C++98)
  • C++總計(jì)63個(gè)關(guān)鍵字,C語(yǔ)言32個(gè)關(guān)鍵字
    在這里插入圖片描述
二、命名空間
  • 在C/C++中,變量、函數(shù)和后面要學(xué)到的類(lèi)都是大量存在的,這些變量、函數(shù)和類(lèi)的名稱(chēng)將都存在于全局作用域中,可能會(huì)導(dǎo)致很多沖突。使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱(chēng)進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對(duì)這種問(wèn)題的
  • 我們來(lái)看看具體是什么樣的問(wèn)題,如下代碼:
#include#includeint rand = 10;//變量rand與庫(kù)函數(shù)rand()沖突了

int main()
{printf("%d\n", rand);
    return 0;
}
  • 可以發(fā)現(xiàn),C語(yǔ)言沒(méi)辦法解決類(lèi)似這樣的命名沖突問(wèn)題,所以C++提出了namespace來(lái)解決
2.1 命名空間定義
  • 定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可,{}中即為命名空間的成員
  1. 正常的命名空間定義
namespace bobo
{// 命名空間中可以定義變量/函數(shù)/類(lèi)型
    int rand = 10;
    int Add(int left, int right)
    {return left + right;
    }
    struct Node
    {struct Node* next;
        int val;
    };
}
  1. 命名空間可以嵌套
namespace N1
{int a;
    int b;
    int Add(int left, int right)
    {return left + right;
    }
    namespace N2
    {int c;
        int d;
        int Sub(int left, int right)
        {return left - right;
        }
    }
}
  1. 同一個(gè)工程中允許存在多個(gè)相同名稱(chēng)的命名空間,編譯器最后會(huì)合成同一個(gè)命名空間中
2.2 命名空間使用
  • 命名空間中成員該如何使用呢?比如:
namespace bobo
{// 命名空間中可以定義變量/函數(shù)/類(lèi)型
    int a = 0;
    int b = 1;
    int Add(int left, int right)
    {return left + right;
    }
    struct Node
    {struct Node* next;
        int val;
    };
}
int main()
{// 編譯報(bào)錯(cuò):error C2065: “a”: 未聲明的標(biāo)識(shí)符
    printf("%d\n", a);
    return 0;
}

結(jié)果:在這里插入圖片描述

  • 命名空間的使用有三種方式:
  1. 加命名空間名稱(chēng)及作用域限定符
int main()
{printf("%d\n", N::a);
    return 0;    
}
  1. 使用using將命名空間中某個(gè)成員引入
using N::b;
int main()
{printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;    
}
  1. 使用using namespace 命名空間名稱(chēng)引入
using namespce N;
int main()
{printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}
三、C++輸入&輸出
  • 我們來(lái)看看:
#include// std是C++標(biāo)準(zhǔn)庫(kù)的命名空間名,C++將標(biāo)準(zhǔn)庫(kù)的定義實(shí)現(xiàn)都放到這個(gè)命名空間中
using namespace std;
int main()
{cout<< "Hello world!!!"<< endl;
	return 0;
}
  • 說(shuō)明:

    1. 使用cout標(biāo)準(zhǔn)輸出對(duì)象(控制臺(tái))和cin標(biāo)準(zhǔn)輸入對(duì)象(鍵盤(pán))時(shí),必須包含< iostream >頭文件以及按命名空間使用方法使用std。
    2. cout和cin是全局的流對(duì)象,endl是特殊的C++符號(hào),表示換行輸出,他們都包含在包含< iostream >頭文件中
    3. <<是流插入運(yùn)算符,>>是流提取運(yùn)算符
    4. 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣,需要手動(dòng)控制格式。C++的輸入輸出可以自動(dòng)識(shí)別變量類(lèi)型
  • 注意:
    早期標(biāo)準(zhǔn)庫(kù)將所有功能在全局域中實(shí)現(xiàn),聲明在.h后綴的頭文件中,使用時(shí)只需包含對(duì)應(yīng)頭文件即可,后來(lái)將其實(shí)現(xiàn)在std命名空間下,為了和C頭文件區(qū)分,也為了正確使用命名空間,規(guī)定C++頭文件不帶.h;舊編譯器(vc 6.0)中還支格式,后續(xù)編譯器已不支持,因此推薦使用

#includeusing namespace std;
 
int main()
{int a;
   double b;
   char c;
     
   // 可以自動(dòng)識(shí)別變量的類(lèi)型
   cin>>a;
   cin>>b>>c;
     
   cout<
  • std命名空間的使用慣例:
    std是C++標(biāo)準(zhǔn)庫(kù)的命名空間,如何展開(kāi)std使用更合理呢?
    1. 在日常練習(xí)中,建議直接using namespace std即可,這樣就很方便
    2. using namespace std展開(kāi),標(biāo)準(zhǔn)庫(kù)就全部暴露出來(lái)了,如果我們定義跟庫(kù)重名的類(lèi)型/對(duì)象/函數(shù),就存在沖突問(wèn)題。該問(wèn)題在日常練習(xí)中很少出現(xiàn),但是項(xiàng)目開(kāi)發(fā)中代碼較多、規(guī)模大,就很容易出現(xiàn)。所以建議在項(xiàng)目開(kāi)發(fā)中使用,像std::cout這樣使用時(shí)指定命名空間 + using std::cout展開(kāi)常用的庫(kù)對(duì)象/類(lèi)型等方式
四、auto關(guān)鍵字(C++11) 4.1 類(lèi)型別名思考
  • 隨著程序越來(lái)越復(fù)雜,程序中用到的類(lèi)型也越來(lái)越復(fù)雜,經(jīng)常體現(xiàn)在:
    1. 類(lèi)型難于拼寫(xiě)
    2. 含義不明確導(dǎo)致容易出錯(cuò)
#include#includeint main()
{std::mapm{{"apple", "蘋(píng)果" }, {"orange", "橙子" }, {"pear","梨"} };
    std::map::iterator it = m.begin();
    while (it != m.end())
    {//....
    }
    return 0;
}

std::map::iterator是一個(gè)類(lèi)型,但是該類(lèi)型太長(zhǎng)了,特別容
易寫(xiě)錯(cuò)。聰明的同學(xué)可能已經(jīng)想到:可以通過(guò)typedef給類(lèi)型取別名,比如:

#include#includetypedef std::mapMap;
int main()
{Map m{{"apple", "蘋(píng)果" },{"orange", "橙子" }, {"pear","梨"} };
    Map::iterator it = m.begin();
    while (it != m.end())
    {//....
    }
    return 0;
}

使用typedef給類(lèi)型取別名確實(shí)可以簡(jiǎn)化代碼,但是typedef有會(huì)遇到新的難題:

typedef char* pstring;
int main()
{const pstring p1;    // 編譯成功還是失敗?
    const pstring* p2;   // 編譯成功還是失?。?    return 0;
}

在編程時(shí),常常需要把表達(dá)式的值賦值給變量,這就要求在聲明變量的時(shí)候清楚地知道表達(dá)式的類(lèi)型。然而有時(shí)候要做到這點(diǎn)并非那么容易,因此C++11給auto賦予了新的含義

4.2 auto簡(jiǎn)介
  • 在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動(dòng)存儲(chǔ)器的局部變量,但遺憾的是一直沒(méi)有人去使用它,大家可思考下為什么?
  • C++11中,標(biāo)準(zhǔn)委員會(huì)賦予了auto全新的含義即:auto不再是一個(gè)存儲(chǔ)類(lèi)型指示符,而是作為一個(gè)新的類(lèi)型指示符來(lái)指示編譯器,auto聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得
int TestAuto()
{return 10;
}
int main()
{int a = 10;
	auto b = a;
	auto c = 'a';
	auto d = TestAuto();
	auto e;
 
	cout<< typeid(b).name()<< endl;
	cout<< typeid(c).name()<< endl;
	cout<< typeid(d).name()<< endl;
 
	//auto e; 無(wú)法通過(guò)編譯,使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化
	return 0;
}

注意:
使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化,在編譯階段編譯器需要根據(jù)初始化表達(dá)式來(lái)推導(dǎo)auto的實(shí)際類(lèi)型。因此auto并非是一種“類(lèi)型”的聲明,而是一個(gè)類(lèi)型聲明時(shí)的“占位符”,編譯器在編譯期會(huì)將auto替換為變量實(shí)際的類(lèi)型

4.3 auto的使用細(xì)則
  1. auto與指針和引用結(jié)合起來(lái)使用
    用auto聲明指針類(lèi)型時(shí),用auto和auto*沒(méi)有任何區(qū)別,但用auto聲明引用類(lèi)型時(shí)則必須加&
int main()
{int x = 10;
    auto a = &x;
    auto* b = &x;
    auto& c = x;
    cout<< typeid(a).name()<< endl;
    cout<< typeid(b).name()<< endl;
    cout<< typeid(c).name()<< endl;

    return 0;
}

輸出結(jié)果:在這里插入圖片描述

  1. 在同一行定義多個(gè)變量
    當(dāng)在同一行聲明多個(gè)變量時(shí),這些變量必須是相同的類(lèi)型,否則編譯器將會(huì)報(bào)錯(cuò),因?yàn)榫幾g器實(shí)際只對(duì)第一個(gè)類(lèi)型進(jìn)行推導(dǎo),然后用推導(dǎo)出來(lái)的類(lèi)型定義其他變量
void TestAuto()
{auto a = 1, b = 2; 
    auto c = 3, d = 4.0;  // 該行代碼會(huì)編譯失敗,因?yàn)閏和d的初始化表達(dá)式類(lèi)型不同
}
4.4 auto不能推導(dǎo)的場(chǎng)景
  1. auto不能作為函數(shù)的參數(shù)
// 此處代碼編譯失敗,auto不能作為形參類(lèi)型,因?yàn)榫幾g器無(wú)法對(duì)a的實(shí)際類(lèi)型進(jìn)行推導(dǎo)
void TestAuto(auto a)
{}
  1. auto不能直接用來(lái)聲明數(shù)組
void TestAuto()
{int a[] = {1,2,3};
    auto b[] = {4,5,6};
}
  1. 為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類(lèi)型指示符的用法
  2. auto在實(shí)際中最常見(jiàn)的優(yōu)勢(shì)用法就是跟以后會(huì)講到的C++11提供的新式for循環(huán),還有l(wèi)ambda表達(dá)式等進(jìn)行配合使用
五、基于范圍的for循環(huán)(C++11) 5.1 范圍for的語(yǔ)法
  • 在C++98中如果要遍歷一個(gè)數(shù)組,可以按照以下方式進(jìn)行:
void TestFor()
{int array[] = {1, 2, 3, 4, 5 };
    for (int i = 0; i< sizeof(array) / sizeof(array[0]); ++i)
        array[i] *= 2;

    for (int* p = array; p< array + sizeof(array) / sizeof(array[0]); ++p)
        cout<< *p<< endl;
}

對(duì)于一個(gè)有范圍的集合而言,由程序員來(lái)說(shuō)明循環(huán)的范圍是多余的,有時(shí)候還會(huì)容易犯錯(cuò)誤。因此C++11中引入了基于范圍的for循環(huán)。for循環(huán)后的括號(hào)由冒號(hào)“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍

void TestFor()
{int array[] = {1, 2, 3, 4, 5 };
    for (auto& e : array)
        e *= 2;

    for (auto e : array)
        cout<< e<< " ";

    return 0;
}

注意: 與普通循環(huán)類(lèi)似,可以用continue來(lái)結(jié)束本次循環(huán),也可以用break來(lái)跳出整個(gè)循環(huán)

5.2 范圍for的使用條件
  • for循環(huán)迭代的范圍必須是確定的:
    對(duì)于數(shù)組而言,就是數(shù)組中第一個(gè)元素和最后一個(gè)元素的范圍;對(duì)于類(lèi)而言,應(yīng)該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍
    注意: 以下代碼就有問(wèn)題,因?yàn)閒or的范圍不確定
void TestFor(int array[])
{for (auto& e : array)
        cout<< e<< endl;
}
六、指針空值nullptr(C++11) 6.1 C++98中的指針空值
  • 在良好的C/C++編程習(xí)慣中,聲明一個(gè)變量時(shí)最好給該變量一個(gè)合適的初始值,否則可能會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤,比如未初始化的指針。如果一個(gè)指針沒(méi)有合法的指向,我們基本都是按照如下方式對(duì)其進(jìn)行初始化:
void TestPtr()
{int* p1 = NULL;
	int* p2 = 0;
	// ……
}

NULL實(shí)際是一個(gè)宏,在傳統(tǒng)的C頭文件(stddef.h)中,可以看到如下代碼:

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

可以看到,NULL可能被定義為字面常量0,或者被定義為無(wú)類(lèi)型指針(void*)的常量。不論采取何種定義,在使用空值的指針時(shí),都不可避免的會(huì)遇到一些麻煩,比如:

void f(int)
{cout<<"f(int)"<cout<<"f(int*)"<f(0);
    f(NULL);
    f((int*)NULL);
    return 0;
}
  • 程序本意是想通過(guò)f(NULL)調(diào)用指針版本的f(int*)函數(shù),但是由于NULL被定義成0,因此與程序的初衷相悖
  • 在C++98中,字面常量0既可以是一個(gè)整形數(shù)字,也可以是無(wú)類(lèi)型的指針(void*)常量,但是編譯器默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針?lè)绞絹?lái)使用,必須對(duì)其進(jìn)行強(qiáng)轉(zhuǎn)(void *)0

注意:

  1. 在使用nullptr表示指針空值時(shí),不需要包含頭文件,因?yàn)閚ullptr是C++11作為新關(guān)鍵字引入的
  2. 在C++11中,sizeof(nullptr) 與 sizeof((void*)0)所占的字節(jié)數(shù)相同
  3. 為了提高代碼的健壯性,在后續(xù)表示指針空值時(shí)建議最好使用nullptr

在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

本文題目:C++·入門(mén)|準(zhǔn)備知識(shí)-創(chuàng)新互聯(lián)
本文路徑:http://www.rwnh.cn/article22/ccijjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)網(wǎng)站收錄、域名注冊(cè)、軟件開(kāi)發(fā)、ChatGPT、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

正定县| 浑源县| 荥经县| 玉环县| 兴安县| 丹棱县| 兴化市| 辽宁省| 调兵山市| 胶南市| 乐山市| 托里县| 绥江县| 渭源县| 青冈县| 临洮县| 石楼县| 财经| 北川| 磴口县| 广昌县| 朝阳区| 靖安县| 漯河市| 高邮市| 社旗县| 溧水县| 香格里拉县| 和顺县| 沽源县| 赤壁市| 平乐县| 蓝山县| 仁怀市| 崇州市| 河曲县| 抚顺县| 陇川县| 西城区| 黄平县| 神农架林区|