C++·入門|準備知識-創新互聯

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

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

👱個人主頁: 《 C G o d 的 個 人 主 頁 》 \color{Darkorange}{《CGod的個人主頁》} 《CGod的個人主頁》交個朋友叭~
💒個人社區: 《 編 程 成 神 技 術 交 流 社 區 》 \color{Darkorange}{《編程成神技術交流社區》} 《編程成神技術交流社區》加入我們,一起高效學習,收割好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循環(C++11)
    • 5.1 范圍for的語法
    • 5.2 范圍for的使用條件
  • 六、指針空值nullptr(C++11)
    • 6.1 C++98中的指針空值


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

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

int main()
{printf("%d\n", rand);
    return 0;
}
  • 可以發現,C語言沒辦法解決類似這樣的命名沖突問題,所以C++提出了namespace來解決
2.1 命名空間定義
  • 定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名空間的成員
  1. 正常的命名空間定義
namespace bobo
{// 命名空間中可以定義變量/函數/類型
    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
{// 命名空間中可以定義變量/函數/類型
    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++將標準庫的定義實現都放到這個命名空間中
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++的輸入輸出可以自動識別變量類型
  • 注意:
    早期標準庫將所有功能在全局域中實現,聲明在.h后綴的頭文件中,使用時只需包含對應頭文件即可,后來將其實現在std命名空間下,為了和C頭文件區分,也為了正確使用命名空間,規定C++頭文件不帶.h;舊編譯器(vc 6.0)中還支格式,后續編譯器已不支持,因此推薦使用

#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展開,標準庫就全部暴露出來了,如果我們定義跟庫重名的類型/對象/函數,就存在沖突問題。該問題在日常練習中很少出現,但是項目開發中代碼較多、規模大,就很容易出現。所以建議在項目開發中使用,像std::cout這樣使用時指定命名空間 + using std::cout展開常用的庫對象/類型等方式
四、auto關鍵字(C++11) 4.1 類型別名思考
  • 隨著程序越來越復雜,程序中用到的類型也越來越復雜,經常體現在:
    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定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為變量實際的類型

4.3 auto的使用細則
  1. auto與指針和引用結合起來使用
    用auto聲明指針類型時,用auto和auto*沒有任何區別,但用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不能作為函數的參數
// 此處代碼編譯失敗,auto不能作為形參類型,因為編譯器無法對a的實際類型進行推導
void TestAuto(auto a)
{}
  1. auto不能直接用來聲明數組
void TestAuto()
{int a[] = {1,2,3};
    auto b[] = {4,5,6};
}
  1. 為了避免與C++98中的auto發生混淆,C++11只保留了auto作為類型指示符的用法
  2. auto在實際中最常見的優勢用法就是跟以后會講到的C++11提供的新式for循環,還有lambda表達式等進行配合使用
五、基于范圍的for循環(C++11) 5.1 范圍for的語法
  • 在C++98中如果要遍歷一個數組,可以按照以下方式進行:
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;
}

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

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

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

    return 0;
}

注意: 與普通循環類似,可以用continue來結束本次循環,也可以用break來跳出整個循環

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

NULL實際是一個宏,在傳統的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*)函數,但是由于NULL被定義成0,因此與程序的初衷相悖
  • 在C++98中,字面常量0既可以是一個整形數字,也可以是無類型的指針(void*)常量,但是編譯器默認情況下將其看成是一個整形常量,如果要將其按照指針方式來使用,必須對其進行強轉(void *)0

注意:

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

在這里插入圖片描述

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

本文題目:C++·入門|準備知識-創新互聯
本文路徑:http://m.kartarina.com/article22/ccijjc.html

成都網站建設公司_創新互聯,為您提供移動網站建設網站收錄域名注冊軟件開發ChatGPT服務器托管

廣告

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

主站蜘蛛池模板: 久久国产加勒比精品无码| 亚洲Av无码精品色午夜| 无码中文人妻视频2019| 无码中文字幕日韩专区视频| 中日韩精品无码一区二区三区| 无码中文人妻在线一区二区三区| 免费A级毛片无码A| 亚洲日产无码中文字幕| 久久久久无码精品国产h动漫| 夜夜添无码一区二区三区| 日韩成人无码一区二区三区| 亚洲AV无码久久精品蜜桃| 小泽玛丽无码视频一区| 久久久久久亚洲Av无码精品专口| 小泽玛丽无码视频一区 | 久久久久久亚洲AV无码专区| 精品乱码一区内射人妻无码| 亚洲av无码一区二区三区人妖 | 国产三级无码内射在线看| 在线精品免费视频无码的| 91精品日韩人妻无码久久不卡| 久久久久无码精品| 亚洲不卡无码av中文字幕| 亚洲精品无码久久久久A片苍井空| 亚洲AV无码乱码在线观看富二代| 久久久久亚洲?V成人无码| 亚洲精品无码专区久久同性男| 无码丰满熟妇浪潮一区二区AV| 69ZXX少妇内射无码| 亚洲日韩乱码中文无码蜜桃| 国产免费无码AV片在线观看不卡| 国产精品无码一区二区在线观一 | 人妻无码αv中文字幕久久| 国产亚洲情侣一区二区无码AV| 人妻丰满?V无码久久不卡| 四虎成人精品国产永久免费无码| 日韩av片无码一区二区三区不卡| 人妻中文字幕AV无码专区| 人妻丰满熟妇A v无码区不卡| 国产精品va无码免费麻豆| 国产a v无码专区亚洲av|