最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

新手學習C++的基礎知識概況總結

 更新時間:2026年03月28日 14:09:11   作者:chh563  
文章介紹了C++中命名空間的定義和使用,包括定義和沖突解決、使用方式和標準庫中的應用,還詳細介紹了C++輸入輸出流、缺省參數、函數重載、引用、內聯(lián)函數和nullptr等概念及其用法和注意事項

1.C++的第一個程序

#include <iostream>
using namespace std;
int main()
{
	cout << "Hello World" << endl;
	return 0;
}

2.命名空間

2.1 namespace的價值

在C/C++中,變量、函數和后面要學到的類都是大量存在的,這些變量、函數和類的名稱都存在于全局作用域中,可能會導致很多沖突。命名空間的目的就是對標識符進行本地化,以避免命名沖突,namespace關鍵字的出現就是針對這種問題的。

2.2 namespace的定義

  • 定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名空間的成員,命名空間中可以定義變量、函數、類型等。
  • namespace本質是定義一個域,這個域跟全局域各自獨立,不同的域可以定義同名變量,所以下面的rand不沖突。
  • C++中域有函數局部域,全局域,命名空間域,類域;域影響的是編譯時語法查找一個變量/函數/類型出處(聲明或定義)的邏輯,所以有了域隔離,名字沖突就解決了。局部域和全局域除了會影響編譯時的查找邏輯,還會影響變量的生命周期,命名空間域和類域不影響變量的生命周期
  • namespace只能定義在全局,當然它還可以嵌套定義。
  • 項目工程中多文件中定義的同名namespace會認為是同一個namespace,不會沖突。
  • C++標準庫都放在一個叫std(standard)的命名空間中。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
namespace abc
{
    int rand = 10;
    int Add(int left,int right)
    {
        return left + right;
    }
    struct Node
    {
        struct Node* next;
        int val;
    };
}
int main()
{
    //這里默認訪問的是全局的rand函數指針
    printf("%p\n",rand);
    //這里訪問的是abc命名空間中的rand變量
    printf("%d\n",abc::rand);
    return 0;
}
//關于命名空間的嵌套
namespace asd
{
    namespace aaa
    {
        int rand = 15;
    }
    namespace bbb
    {
        int rand = 20;
    }
}
int main()
{
    printf("%d\n",asd::aaa::rand);
    printf("%d\n",asd::bbb::rand);
    return 0;
}

2.3命名空間使用

編譯查找一個變量的聲明/定義,默認只會在局部或者全局查找,不會到命名空間里去查找。所以下面程序會編譯報錯。所以我們要使用命名空間中定義的變量/函數,有三種方式:

  • 指定命名空間,項目中推薦這種方式。
  • using將命名空間中某個成員展開,項目中經常訪問的,不存在沖突的成員推薦這種方式。
  • 展開命名空間中全部成員,項目不推薦,沖突風險大,日常練習程序為了方便推薦使用。
namespace N
{
    int a = 0;
    int b = 0;
}
//指定命名空間訪問
int main()
{
    printf("%d\n",N::a);
    return 0;
}
//將命名空間中某個成員展開
using N::b;
int main()
{
    printf("%d\n",N::a);
    printf("%d\n",b);
    return 0;
}
//將命名空間全部展開
using namespace N;
int mian()
{
    printf("%d\n",a);
    printf("%d\n",b);
    return 0;
}

3.C++輸入&輸出

  • 是Input Output Stream的縮寫,是標準的輸入、輸出流庫,定義了標準的輸入、輸出對象。
  • std::cin是istream類的對象,它主要面向窄字符的標準輸入流。
  • std::cout是ostream類的對象,它主要面向窄字符的標準輸出流。
  • std::endl是一個函數,流插入輸出時,相當于一個換行符加刷新緩沖區(qū)
  • <<是流插入運算符,>>是流提取運算符。
  • C++輸入輸出不需要像printf/scanf輸入輸出那樣指定格式,C++輸入輸出可以自動識別變量類型。
  • cout/cin/endl等都屬于C++標準庫,C++標準庫都放在std命名空間中,所以要通過命名空間的使用方式使用它們。
  • 一般練習中我們可以使用using namespace std,實際項目開發(fā)中不建議。
  • 這里我們沒有包含<stdio.h>,也可以使用printf和scanf,在包含間接包含了。VS系列編譯器是這樣的,別的編譯器可能報錯。
#include <stdio.h>
using namespace std

int main()
{
	int a = 0;
	double b = 0.1;
	char c = 'x';

	count << a << " " << b << " " << c << endl;
	std::cout << a << b << c << std::endl;
	scanf("%d%lf\n,&a,&b");
	printf("%d %lf\n,a,b");
	return 0;
}

//在io需求比較高的地方,
//如大部分大量輸入的競賽題中,
//加以下3行代碼,可以提高效率
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

4.缺省參數

  • 缺省參數是聲明或定義時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實參則采用該形參的的缺省值,否則使用指定的實參,缺省參數分為全缺省和半缺省參數。(有些地方把
    缺省參數也叫默認參數)
  • 全缺省就是全部形參給缺省值,半缺省就是部分形參給缺省值。C++規(guī)定半缺省參數必須從右往左
    依次連續(xù)缺省,不能間隔跳躍給缺省值。
  • 帶缺省參數的函數調用,C++規(guī)定必須從左到右依次給實參,不能跳躍給實參。
  • 函數聲明和定義分離時,缺省參數不能在函數聲明和定義中同時出現,規(guī)定必須函數聲明給缺省值。
#include <iostream>
#include <assert.h>
using namespace std;
void Func(int a = 0)
{
	cout << a << endl;
}
int main()
{
	Func(); 
	Func(10); 
// 沒有傳參時, 使用 參數的默認值
//傳參時,使用指定的實參
	return 0;
}
#include <iostream>
using namespace std;
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl << endl;
}
//半缺省
void Func2(int a, int b = 10, int c = 20)
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
int main()
{
	Func1();
	Func1(1);
	Func1(1,2);
	Func1(1,2,3);
	Func2(100);
	Func2(100, 200);
	Func2(100,200,300);
	return 0;
}

5.函數重載

C++支持在同一作用域中出現同名函數
,但是要求這些同名函數的形參不同,可以是參數個數不同或者類型不同。這樣C++函數調用就表現出了多態(tài)行為,使用更靈活。C語言是不支持同一作用域中出現同名函數的。

#include<iostream>
using namespace std;
// 1、 參數類型不同
int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}
// 2、參數個數不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
}
---------此時調用f()會報錯,編譯器不知道調用誰
cout << "f(int a)" << endl;
//3、參數類型順序不同
void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}
// 返回值不同不能作為重載條件 ,
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}


// 下面兩個函數構成重載
// f()但是調用時,會報錯,存在歧義,編譯器不知 道調用誰
void f1()
{
	cout << "f()" << endl;
}
void f1(int a = 10)
{
	cout << "f(int a)" << endl;
}
int main()
{
	Add(10, 20);
	Add(10.1, 20.2);
	f();
	f(10);
	f(10,'a');
	f('a', 10);
	return 0;
}

6.引用

6.1引用的概念和定義

引用不是新定義一個變量,而是給已存在變量取了一個別名,編譯器不會為引用變量開辟內存空間,它和它引用的變量共用同一塊
內存空間。
類型& 引用別名 = 引用對象

#include<iostream>
using namespace std;
int main()
{
	int a = 0;
// 引用 :b和c是a的別名
int& b = a;
int& c = a;
// 也可以給別名b取別名,d相當于還是a的別名
int& d = b;
++d;
// 這里取地址我們看到是一樣的
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}

6.2引用的特性

  • 引用在定義時必須初始化
  • 一個變量可以有多個引用
  • 引用一旦引用一個實體,就不能引用其他實體
#include<iostream>
using namespace std;
int main()
{
	int a = 10;
// 編 譯報 錯 :“ra”: 必 須 初 始 9
//int& ra;
	int& b = a;
	int c = 20;
// 這里并非讓b引用c
// 這里是一個賦值
	b = c;
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	return 0;

6.3引用的使用

  • 引用在實踐中主要是于引用傳參和引用做返回值中減少拷貝提高效率和改變引用對象時同時改變被引用對象。
  • 引用傳參跟指針傳參功能是類似的,引用傳參相對更方便一些。
  • 引用和指針在實踐中相輔相成,功能有重疊性,但是各有特點,互相不可替代。C++的引用跟其他語言的引用是有很大的區(qū)別的,除了用法,最大的點,C++引用定義后不能改變指向。
void Swap(int& rx, int& ry)
{
	int tmp = rx;
	rx = ry;
	ry = tmp;
}
int main()
{
	int x = 0, y = 1;
	cout << x <<" " << y << endl;
	Swap(x, y);
	cout << x << " " << y << endl;
	return 0;
}
//指針變量也可以取別名,LTNode*& phead就是給 指針變量取別名
//這樣就不需要用二級指針了,相對而言簡化了程序
//void ListPushBack(LTNode** phead, int x)
//void ListPushBack(LTNode*& phead, int x)

6.4const引用

  • 可以引用一個const對象,但是必須用const引用。const引用也可以引用普通對象,因為對象的訪問權限在引用過程中可以縮小,不能放大。
  • 不過需要注意的是類似 int& rb = a3; double d = 12.34; int& rd = d; 這樣一些場
    景下a3的和結果保存在一個臨時對象中, int& rd = d 也是類似,在類型轉換中會產生臨時對象存儲中間值,也就是,rb和rd引用的都是臨時對象,而C++規(guī)定臨時對象具有常性,所以這里就觸發(fā)了權限放大,必須要用常引用才可以。
  • 所謂臨時對象就是編譯器需要一個空間暫存表達式的求值結果臨時創(chuàng)建一個未命名對象,C++中把這個未命名對象叫做臨時對象。
int mian()
{
    const int a = 10;
    //這里引用對a訪問權限放大
    //int& ra = a;
    //這樣可以
    const int& ra = a;
    //不能給常量賦值
    //ra++;
    //這里引用對b訪問權限縮小
    int b = 20;
    const int& rb = b;
    //不能給常量賦值
    //rb++;
    return 0;
}

#include<iostream>
using namespace std;
int main()
{
    int a = 10;
    const int& ra = 30;
// 編譯報錯:“初始化”:無法從“int”轉換為“int &”
// int& rb = a * 3;
    const int& rb = a*3;
    double d = 12.34;
// 編譯報錯:“初始化”:無法從“double”轉換為“int &”
// int& rd = d;
    const int& rd = d;
    return 0;
}

6.5指針和引用的關系

C++中指針和引用就像兩個性格迥異的親兄弟,指針是哥哥,引用是弟弟,在實踐中他們相輔相成,功能有重疊性,但是各自有各自特點,互相不可替代。
• 語法概念上引用是一個變量的取別名不開空間,指針是存儲一個變量地址,要開空間。
• 引用在定義時必須初始化,指針建議初始化,但是語法上不是必須的。
• 引用在初始化時引用一個對象后,就不能再引用其他對象;而指針可以在不斷地改變指向對象。
• 引用可以直接訪問指向對象,指針需要解引用才是訪問指向對象。
• sizeof中含義不同,引用結果為引用類型的大小,但指針始終是地址空間所占字節(jié)個數(32位平臺下,64位下是8byte)
• 指針很容易出現空指針和野指針的問題,引用很少出現,引用使用起來相對更安全一些。

7.inline

• inline修飾的函數叫做內聯(lián)函數,編譯時C++編譯器會在調用的地方展開內聯(lián)函數,這樣調用內聯(lián)函數就需要建立棧幀了,就可以提高效率。
• inline對于編譯器而言只是一個建議,也就是說,你加了inline編譯器也可以選擇在調用的地方不展開,不同編譯器關于inline什么情況展開各不相同,因為C++標準沒有規(guī)定這個。inline適用于頻繁調用的短小函數,對于遞歸函數,代碼相對多一些的函數,加上inline也會被編譯器忽略。
• C語言實現宏函數也會在預處理時替換展開,但是宏函數實現很復雜很容易出錯的,且不方便調
試,C++設計了inline目的就是替代C的宏函數。
• vs編譯器 debug版本下面默認是不展開inline的,這樣方便調試,debug版本想展開需要設置下以下兩個地方。
• inline不建議聲明和定義分離到兩個文件,分離會導致鏈接錯誤。因為inline被展開,就沒有函數地址,鏈接時會出現報錯。

#include<iostream>
using namespace std;
inline int Add(int x, int y)
{
    int ret = x + y;
    ret += 1;
    ret += 1;
    ret += 1;
    return ret;
}
int main()
{
// 可 以 通 過 匯 編 觀察程序 是 否 展 開
// 有call Add語 句就 是 沒 有 展 開,沒 有就 是 展 開 了
    int ret = Add(1, 2);
    cout << Add(1, 2) * 5 << endl;
    return 0;
}
#include<iostream>
using namespace std;
// 實 現一個 ADD宏函數的 常見 問 題
//#define ADD(int a, int b) return a + b;
//#define ADD(a, b) a + b;
//#define ADD(a, b) (a + b)
// 正確 的宏實 現
// // // #define ADD(a, b) ((a) + (b))
// 為什 么 不 能加 分 號?
// 為什 么 要 加 外面 的 括 號?
// 為什 么 要 加里面 的 括 號?
int main()
{
    int ret = ADD(1, 2);
    cout << ADD(1, 2) << endl;
    cout << ADD(1, 2)*5 << endl;
    int x = 1, y = 2;
    ADD(x & y, x | y); // -> (x&y+x|y)
    return 0;
}
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
    cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
// 鏈 接錯 誤:無 法 解析 的 外 部符 號 f(10);
    f(10);
    return 0;
//"void__cdecl f(int)" (?f@@YAXH@Z)
}

8.nullptr

C++中NULL可能被定義為字面常量0,C語言中為(void*)。
nullptr是特殊關鍵字,它可以隱式轉換成其他類型的指針,不能被轉換成整數類型。

#include<iostream>
using namespace std;
void f(int x)
{
    cout << "f(int x)" << endl;
}
void f(int* ptr)
{
    cout << "f(int* ptr)" << endl;
}
int main()
{
    f(0);

// 本 想 通 過 f(NULL)調用 指 針 版本 的 f(int* ptr)函數
//,但 是 由 于NULL被 定 義 成0,調用 了f(int x)
//因此與 程序 的 初 衷 相悖 。
    f(NULL);
    f((int*)NULL);
// 編 譯報 錯 : error C2665: “f”: 2 個 重 載 中 沒 有一個 可 以 轉 換所 有參數類型
// f((void*)NULL);
    f(nullptr);

    //C++,必須強轉
    void* p1 = NULL;
    int* p2 = (int*)p1;

    //使用nullptr
    void* p1 = nullptr;
    int* p2 = p1;
    //C語言有隱式類型轉換,可以通過
    void* p1 = NULL;
    int* p2 = p1;
return 0;
}

總結

文章介紹了C++中命名空間的定義和使用,包括定義和沖突解決、使用方式和標準庫中的應用,還詳細介紹了C++輸入輸出流、缺省參數、函數重載、引用、內聯(lián)函數和nullptr等概念及其用法和注意事項。

到此這篇關于新手學習C++的基礎知識概況總結的文章就介紹到這了,更多相關學習C++的基礎知識內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析C語言中的數組及字符數組

    淺析C語言中的數組及字符數組

    這篇文章主要介紹了C語言中的數組及字符數組,是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • 詳解如何利用C++實現Mystring類

    詳解如何利用C++實現Mystring類

    這篇文章主要為大家詳細介紹了C++實現MyString的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • opencv3機器學習之EM算法示例詳解

    opencv3機器學習之EM算法示例詳解

    這篇文章主要介紹了opencv3機器學習之EM算法的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • QT使用QFile進行文件操作

    QT使用QFile進行文件操作

    本文主要介紹了QT使用QFile進行文件操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • C++中關于getchar()的使用方法

    C++中關于getchar()的使用方法

    這篇文章主要介紹了C++中關于getchar()的使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++深入淺出講解函數重載

    C++深入淺出講解函數重載

    C++允許多個函數擁有相同的名字,只要它們的參數列表不同就可以,這就是函數的重載(Function?Overloading),借助重載,一個函數名可以有多種用途
    2022-05-05
  • c/c++中struct定義、聲明、對齊方式解析

    c/c++中struct定義、聲明、對齊方式解析

    這篇文章通過C/C++的兩種聲明方式開始,給大家詳細分析了/c+中struct定義、聲明、對齊方式,對此有興趣的朋友可以參考學習下。
    2018-03-03
  • C++超詳細講解構造函數與析構函數的用法及實現

    C++超詳細講解構造函數與析構函數的用法及實現

    構造函數主要作用在于創(chuàng)建對象時為對象的成員屬性賦值,構造函數由編譯器自動調用,無須手動調用;析構函數主要作用在于對象銷毀前系統(tǒng)自動調用,執(zhí)行一?些清理工作
    2022-05-05
  • C++ 動態(tài)內存管理詳情解說

    C++ 動態(tài)內存管理詳情解說

    這篇文章主要介紹了C++ 動態(tài)內存管理詳情解說,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下,希望對你的學習有所幫助
    2022-07-07
  • C++實現特殊矩陣的壓縮存儲算法

    C++實現特殊矩陣的壓縮存儲算法

    在實際存儲時,會發(fā)現矩陣中有許多值相同的數據或有許多零數據,且分布呈現出一定的規(guī)律,稱這類型的矩陣為特殊矩陣。本文將利用C++實現特殊矩陣的壓縮存儲,感興趣的可以了解一下
    2022-08-08

最新評論

张家川| 博罗县| 桦甸市| 武川县| 来安县| 淳化县| 榆社县| 凉山| 温宿县| 会宁县| 华蓥市| 临城县| 威远县| 珲春市| 横山县| 康定县| 会同县| 哈尔滨市| 神农架林区| 元江| 东明县| 万荣县| 兴义市| 比如县| 松潘县| 上饶县| 汉中市| 南溪县| 衡水市| 南漳县| 荣昌县| 乐昌市| 鄂尔多斯市| 天全县| 澜沧| 兴义市| 金塔县| 恩施市| 闽侯县| 江口县| 青田县|