C++入門學習

1.命名空間的介紹

首先我們看到如下的代碼,在C語言中:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C語言沒辦法解決類似這樣的命名沖突問題,所以C++提出了namespace來解決
int main()
{printf("%d\n", rand);return 0;
}
// 編譯后后報錯:error C2365: “rand”: 重定義;以前的定義是“函數”
// 在掃雷小游戲中,使用到了rand函數生成隨機數

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

使用namespace關鍵字定義屬于我們自己的命名空間:namespace關鍵字后面加上命名空間的名字,然后接一對{}即可,{} 中即為命名空間的成員。如下:

// jess是命名空間的名字。
// 1. 正常的命名空間定義
namespace jess
{// 命名空間中可以定義變量/函數/類型int rand = 10;int Add(int x, int y){return x + y;}struct Node{struct Node* next;int val;};
}//2. 命名空間可以嵌套--這里命名空間N1中嵌套了N2
// test.cpp
namespace N1
{int a;int b;int Add(int x, int y){return x + y;}namespace N2{int c;int d;int Sub(int x, int y){return x - y;}}
}//3. 同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中。
// ps:一個工程中的test.h和上面test.cpp中兩個N1會被合并成一個
// test.h
namespace N1
{int Mul(int x, int y){return x * y;}
}

注意:一個命名空間就定義了一個新的作用域,命名空間中的所有內容都局限于該命名空間中

定義了屬于自己的命名空間后,應該如何使用呢?

有三種使用方式:

1.加命名空間名稱及作用域限定符(空間名稱::需要訪問的變量/函數)

namespace jess
{// 命名空間中可以定義變量/函數/類型int a = 10;int Add(int x, int y){return x + y;}int main()
{printf("%d\n", jess::a);return 0; ? ?
}

2.使用using將命名空間中某個成員引入

namespace jess
{// 命名空間中可以定義變量/函數/類型int a = 10;int b = 20;int Add(int x, int y){return x + y;}using jess::b;  // 使用using將命名空間中某個成員引入
int main()
{printf("%d\n", jess::a);printf("%d\n", b);return 0; ? ?
}

3.使用using namespace 命名空間名稱引入

namespace jess
{// 命名空間中可以定義變量/函數/類型int a = 10;int b = 20;int Add(int x, int y){return x + y;}using namespce jess;  // 使用using namespace 命名空間名稱引入int main()
{printf("%d\n", N::a);printf("%d\n", b);int ret = Add(10, 20);return 0; ? ?
}

2.C++中如何實現輸入和輸出

?還記得,C語言第一課講的是如何在屏幕中打印hello world!C語言如下:

#include <stdio.h>int main()
{printf("hello world!");return 0;
}

C++如下:

#include <iostream>
// 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++的輸入輸出可以自動識別變量類型。

5. 實際上cout和cin分別是ostream和istream類型的對象(后續會提到)。

#include <iostream>
using namespace std;int main()
{int a;double b;char c;// 可以自動識別變量的類型cin>>a;                   // 從鍵盤中讀取數值,存放到變量a的地址中cin>>b>>c;                // 從鍵盤中依次讀取數值(空格分隔),存放到變量b、c的地址中cout<<a<<endl;            // 在終端中打印a的值并且換行cout<<b<<" "<<c<<endl;    // 在終端中打印b的值再打印一個空格再打印c最后換行return 0;
}

3.缺省參數?

缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實 參則采用該形參的缺省值,否則使用指定的實參。如下:

#include <iostream>
using namespace std;void Test(int a = 0)
{cout<<"a = "<<a<<endl;
}
int main()
{Test(); ? ? // 沒有傳參時,使用參數的默認值,打印:a = 0Test(10); ? // 傳參時,使用指定的實參,打印:a = 10return 0;
}

3.1全缺省參數

#include <iostream>
using namespace std;void Test(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}int main()
{Test(); ? ? // 沒有傳參時,使用參數的默認值,打印:a = 10 b=20 c=30Test(1); ? // 傳參時,使用指定的實參,打印::a = 1 b=20 c=30return 0;
}

3.2半缺省參數

#include <iostream>
using namespace std;void Test(int a, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}int main()
{// 此時第一個位置的參數必須傳遞Test(1); ? ? // 沒有傳參時,使用參數的默認值,打印:a = 1 b=20 c=30Test(1,2); ? // 傳參時,使用指定的實參,打印::a = 1 b=2 c=30return 0;
}

注意:

1. 半缺省參數必須從右往左依次來給出,不能間隔著給

2. 缺省參數不能在函數聲明和定義中同時出現

// 正確做法:
// 缺省參數只在聲明中指定(通常在頭文件),定義中不能重復指定。如下:// 聲明(.h文件):指定缺省參數
void func(int a = 10); // 定義(.cpp文件):不能重復缺省參數
void func(int a) {  // 正確,無缺省值// ...
}

3. 缺省值必須是常量或者全局變量

// 錯誤例子
void func(int a = x)  // 錯誤!x是局部變量,編譯時無法確定其值
{cout<<a<<endl;
}int main() 
{int x = 5;func();  // 無法確定用什么值替換return 0;
}// 正確例子
int g = 20;  // 全局變量void func(int a = 10, int b = g) // 10是常量,g是全局變量,都符合語法
{  // ...
}

4. C語言不支持(編譯器不支持)

4.函數重載

函數重載:是函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這 些同名函數的形參列表(參數個數 或 類型 或 類型順序)不同,常用來處理實現功能類似數據類型不同的問題。

#include<iostream>
using namespace std;// 1、參數類型不同
int Add(int x, int y)
{cout << "int Add(int x, int y)" << endl;return x+ y;
}double Add(double x, double y)
{cout << "double Add(double x, double y)" << endl;return x+ y;
}// 2、參數個數不同
void f()
{cout << "f()" << endl;
}void f(int a)
{cout << "f()" << 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;
}int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}

為什么C++支持函數重載,而C語言不支持函數重載呢?(這里簡單講一下)

在C/C++中,一個程序要運行起來,需要經歷以下幾個階段:預處理、編譯、匯編、鏈接。其中在編譯過程中C/C++對函數的命名規則是不一樣的。C語言對函數的命名規則是:函數名本身;C++對函數的命名規則是:Z_+函數名字符個數+參數類型的首字母。例如Add函數在C/C++在中編譯后的結果(此處說的命名規則是在在linux下,采用gcc編譯得到):

C語言為什么不支持重載,因為無法區分同名函數。而C++是通過函數修飾規則來區分,只要參數不同,修飾出來的名字就不一樣,就支持了重載。

注意:如果兩個函數函數名和參數是一樣的,返回值不同是不構成重載的,因為調用時編譯器沒辦 法區分。

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

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

相關文章

解決python錯誤:playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page() page.goto(url)page.wait_for_load_state(networkidle) 在Python環境中運行以上代碼后報錯: page.wait_for_load_…

爬蟲逆向之雷池waf

本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的。否則由此產生的一切后果均與作者無關&#xff01; 雷池waf概念 雷池 WAF&#xff08;SafeLine&#xff09;是長亭科技開源的一款 Web 應用防火墻&#xff0c;部署在網站前面&#xff0c;把所有進來的 HTTP/…

23種設計模式解析--行為型

行為型模式&#xff08;協作的藝術&#xff09; 觀察者模式 觀察者模式詳解 模式定義 觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為設計模式&#xff0c;用于建立對象間一對多的依賴關系。當一個對象&#xff08;Subject&#xff09;狀態變化時&#xff0c;所…

Linux系統之lua 詳解

命令簡介 lua 是 Lua 語言的解釋器&#xff0c;用于加載和執行 Lua 程序&#xff08;包括文本源碼和預編譯的二進制文件&#xff09;。它支持兩種運行模式&#xff1a;批處理模式&#xff08;執行指定腳本文件&#xff09;和交互式模式&#xff08;逐行讀取并執行輸入的命令&am…

visual studio 無明顯錯誤,但是無法編譯成功解決—仙盟創夢IDE

往后面查看rror CS0246: 未能找到類型或命名空間名“SimpleClass”(是否缺少 using 指令或程序集引用?)修復阿雪技術觀在科技發展浪潮中&#xff0c;我們不妨積極投身技術共享。不滿足于做受益者&#xff0c;更要主動擔當貢獻者。無論是分享代碼、撰寫技術博客&#xff0c;還是…

《論文閱讀》傳統CoT方法和提出的CoT Prompting的區分

論文&#xff1a;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models作者對傳統CoT方法和本文提出的CoT Prompting的區分。1. 傳統方法的局限性 (1) 基于微調的CoT&#xff08;Rationale-Augmented Training&#xff09; 實現方式&#xff1a;需人工標注大…

Minio 高性能分布式對象存儲

1、什么是對象存儲? 描述: 對象存儲&#xff08;Object Storage&#xff09;是一種存儲數據的計算機體系結構&#xff0c;它以對象的形式存儲和管理數據。與傳統的文件系統和塊存儲不同&#xff0c;對象存儲將數據作為對象存儲在分布式的存儲集群中&#xff0c;每個對象都有一…

[深度學習] 大模型學習4-RAG技術全景解析

在大語言模型基礎知識一文中&#xff0c;檢索增強生成&#xff08;Retrieval-Augmented Generation&#xff0c;簡稱 RAG&#xff09;技術作為構建大語言模型&#xff08;Large Language Model&#xff0c;簡稱 LLM&#xff09;應用的一種方式已被簡要提及&#xff0c;本文將詳…

4G/5G無線電單元系統

4G/5G無線電單元系統 ADI公司的核心技術和領域專業知識幫助客戶在全球范圍內規劃、設計、打造更出色的高性能通信系統。 我們的無線電單元(RU)設計平臺利用新一代技術來提供高性能解決方案&#xff0c;幫助客戶消除設計障礙、縮短產品開發周期&#xff0c;加快產品上市時間。 價…

HarvardX TinyML小筆記1(番外2:神經網絡)

1 介紹 圖片來自&#xff1a;https://zh.wikipedia.org/zh-cn/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C 神經網絡一直感覺挺神奇的&#xff0c;江湖也說可解釋性很差&#xff0c;無論如何還是學學吧。借這次學習哈佛的TinyML&#xff0c;也就順帶弄了。 這里…

計算機網絡 第2章通信基礎(竟成)

第 2 章 物理層【考綱內容】1.通信基礎 (1) 信道、信號、帶寬、碼元、波特、速率、信源與信宿等基本概念 (2) 奈奎斯特定理與香農定理 (3) 編碼與調制 (4) 電路交換、報文交換與分組交換 (5) 數據報與虛電路2.傳輸介質 (1) 雙絞線、同軸電纜、光纖與無線傳輸介質&#xff1b;(2…

2025-08-09通過授權碼的方式給exe程序充值

2025-08-09通過授權碼的方式給exe程序充值主要點&#xff1a; 一次性授權機制&#xff1a; 新增 .used_licenses 文件記錄所有已使用的授權碼 每次激活前檢查授權碼是否在已使用列表中 激活成功后立即將授權碼標記為已使用 時效性驗證&#xff1a; 授權碼包含過期時間戳&#x…

工具類-高效集合差異計算工具DiffWrapper

集合差異工具類-DiffWrapper 原因 在編輯過程中&#xff0c;肯定會存在對于子表的更新操作&#xff0c;這種更新分為三種&#xff1a; 要加的&#xff0c; 要刪的&#xff0c;要更新的&#xff0c;并且傳參只有一個modifyVO的, 每一個都寫有點過于冗余&#xff0c;故考慮提取一…

SimBA算法實現過程

文章目錄添加噪聲衡量擾動示例數值總結高級索引變量名代碼總體代碼添加噪聲 操作&#xff1a;將頻率擾動通過trans( )轉為像素域擾動加到原始圖像上&#xff08;trans返回頻率域轉換為像素域的結果&#xff09; expanded (images_batch[remaining_indices] # 原始圖像&…

【面試題】cookie和session 的區別

文章目錄一、核心定義與存儲位置二、關鍵區別對比三、典型使用場景四、關聯與依賴總結在Web開發中&#xff0c; Cookie和 Session是兩種常用的狀態管理機制&#xff0c;用于在無狀態的HTTP協議中保存用戶信息&#xff08;如登錄狀態、偏好設置等&#xff09;。二者的核心區別體…

【機器學習】算法調參的兩種方式:網格搜索(枚舉)、隨機搜索

文章目錄一、網格搜索&#xff1a;窮舉式的最優解尋找1、數學推導過程1. 搜索空間的數學結構2. 優化問題的數學性質3. 收斂性分析4. 誤差分析2、為什么網格搜索有效&#xff1f;1. 全局最優性保證2. 可重現性與穩定性3. 參數敏感性分析3、適用場景與局限性二、隨機搜索&#xf…

免費PDF翻譯 離線自建

https://github.com/Byaidu/PDFMathTranslate/blob/main/docs/README_zh-CN.md https://github.com/Byaidu/PDFMathTranslate/releases 方法 針對不同的使用案例&#xff0c;我們提供不同的方法來使用我們的程序&#xff1a;1. UV 安裝 安裝 Python (3.10 < 版本 < 3.12)…

DeepSeek智能考試系統智能體

一、deepseek-app-1.0 1、系統要求 CentOS 7.9Python 3.8Node.js 16MySQL 8.0 2、部署步驟 運行初始化腳本&#xff1a;./scripts/setup.sh初始化數據庫&#xff1a;mysql -u root -p < scripts/init_db.sql啟動服務&#xff1a;./scripts/start.sh 3、訪問地址 前端&…

4深度學習Pytorch-神經網絡--損失函數(sigmoid、Tanh、ReLU、LReLu、softmax)

目錄 激活函數 1. Sigmoid 2. Tanh 函數&#xff08;雙曲正切&#xff09; 3. ReLU 函數 4. Leaky ReLU (LReLU) 5. Softmax 總結對比表 損失函數選擇 激活函數 激活函數是神經網絡中每個神經元&#xff08;節點&#xff09;的核心組成部分。它接收上一層所有輸入的加權…

探索Trae:使用Trae CN爬取 Gitbook 電子書

在以前使用過Cursor&#xff0c;但是后期由于試用資源很少&#xff0c;免費資源用完我就卸載掉啦&#xff0c;最近又需要開展相關工作&#xff0c;因此下載了最新版的Trae。Trae 2.0最近很火&#xff0c;我正好想要爬取某一個Gitbook 電子書&#xff0c;因此嘗試使用Trae和Pyth…