欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C++·入門|準備知識-創(chuàng)新互聯(lián)

在這里插入圖片描述
啊我摔倒了..有沒有人扶我起來學習....

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

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


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


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

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

int main()
{printf("%d\n", rand);
    return 0;
}
  • 可以發(fā)現(xiàn),C語言沒辦法解決類似這樣的命名沖突問題,所以C++提出了namespace來解決
2.1 命名空間定義
  • 定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名空間的成員
  1. 正常的命名空間定義
namespace bobo
{// 命名空間中可以定義變量/函數(shù)/類型
    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. 同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中
2.2 命名空間使用
  • 命名空間中成員該如何使用呢?比如:
namespace bobo
{// 命名空間中可以定義變量/函數(shù)/類型
    int a = 0;
    int b = 1;
    int Add(int left, int right)
    {return left + right;
    }
    struct Node
    {struct Node* next;
        int val;
    };
}
int main()
{// 編譯報錯:error C2065: “a”: 未聲明的標識符
    printf("%d\n", a);
    return 0;
}

結果:在這里插入圖片描述

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

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

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

std::map::iterator是一個類型,但是該類型太長了,特別容
易寫錯。聰明的同學可能已經想到:可以通過typedef給類型取別名,比如:

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

使用typedef給類型取別名確實可以簡化代碼,但是typedef有會遇到新的難題:

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

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

4.2 auto簡介
  • 在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它,大家可思考下為什么?
  • C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得
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; 無法通過編譯,使用auto定義變量時必須對其進行初始化
	return 0;
}

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

4.3 auto的使用細則
  1. auto與指針和引用結合起來使用
    用auto聲明指針類型時,用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時則必須加&
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;
}

輸出結果:在這里插入圖片描述

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

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

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)類似,可以用continue來結束本次循環(huán),也可以用break來跳出整個循環(huán)

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

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

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

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

void f(int)
{cout<<"f(int)"<cout<<"f(int*)"<f(0);
    f(NULL);
    f((int*)NULL);
    return 0;
}
  • 程序本意是想通過f(NULL)調用指針版本的f(int*)函數(shù),但是由于NULL被定義成0,因此與程序的初衷相悖
  • 在C++98中,字面常量0既可以是一個整形數(shù)字,也可以是無類型的指針(void*)常量,但是編譯器默認情況下將其看成是一個整形常量,如果要將其按照指針方式來使用,必須對其進行強轉(void *)0

注意:

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

在這里插入圖片描述

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

本文題目:C++·入門|準備知識-創(chuàng)新互聯(lián)
本文路徑:http://chinadenli.net/article22/ccijjc.html

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

廣告

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