C++基礎篇(1)

目錄

前言

1.第一個C++程序

2.命名空間

2.1概念理解

2.2namespace 的價值

2.3 namespace的定義

3.命名空間的使用

4.C++的輸入輸出

結束語


前言

本節我們將正式進入C++基礎的學習,話不多說,直接上貨!!!

1.第一個C++程序

首先,我們要了解C++的文件命名格式
C++兼容C語言絕大多數的語法,所以C語言實現的hello world依舊可以運行,C++中需要把定義文件代碼后綴改為.cpp,vs編譯器看到是.cpp就會調用C++編譯器編譯,linux下要用g++編譯,不再是gcc。
// test.cpp
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
當然C++有自己的輸入輸出方式,嚴格說C++版本的hello world應該是這樣寫的。(后續會講到)
#include <iostream>
using namespace std;
int main() {cout << "hello world" << endl;return 0;
}

2.命名空間

2.1概念理解

在計算機科學中,命名空間是一種將一組符號名稱(如變量名、函數名、類名等)綁定到特定作用域的上下文的方法,以避免名稱沖突。在不同的編程語言中,命名空間可能以不同的形式存在,但基本概念是相似的。

在C++中,命名空間是一種組織代碼的結構,它允許你將一組具有唯一名稱的實體(如類、函數和變量)封裝在一起,從而避免了全局命名空間的名稱沖突問題。命名空間對于大型項目和庫尤其有用,因為它們可以減少名稱碰撞的可能性,并使代碼更易于管理。

在C++中定義命名空間非常簡單,使用namespace關鍵字后跟命名空間的名字。

要訪問命名空間中的成員,可以使用作用域解析運算符::

故接下來介紹namespace

2.2namespace 的價值

在C/C++中,變量、函數和后面要學到的類都是大量存在的,這些變量、函數和類的名稱將都存在于全局作用域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進?本地化,以免命名 沖突或名字污染,namespace關鍵字的出現就是針對這種問題的。
c語言項目類似下面程序這樣的命名沖突是普遍存在的問題,C++引?namespace就是為了更好的解決這樣的問題
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
// 編譯報錯:error C2365: “rand”: 重定義;以前的定義是“函數”
printf("%d\n", rand);
return 0;
}

C++使用namespace后:

#include <iostream>
#include <stdio.h>
namespace hu{int rand = 10;
}
int main()
{printf("%d\n", hu::rand);return 0;
}

4824e420f3a2455494c532f8fca96273.png

2.3 namespace的定義

在C++中,namespace(命名空間)是C++語言的一個核心特性,不屬于任何特定的庫。

1.定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接?對{}即可,{}中即為命名空間的成員。命名空間中可以定義變量/函數/類型等。
2.namespace本質是定義出?個域,這個域跟全局域各自獨立,不同的域可以定義同名變量,所以rand不在沖突了。
3.C++中域有函數局部域,全局域,命名空間域,類域;域影響的是編譯時語法查找?個變量/函數/ 類型出處(聲明或定義)的邏輯,所有有了域隔離,名字沖突就解決了。局部域和全局域除了會影響編譯查找邏輯,還會影響變量的生命周期, 命名空間域和類域不影響變量生命周期。
代碼展示
#include <stdio.h>
//#include <stdio.h>
#include <stdlib.h>
// hu是命名空間的名字,?般開發中是?項?名字做命名空間名
namespace hu{// 命名空間中可以定義變量/函數/類型int rand = 10;int  add(int x, int y) {return x + y;}//定義一個節點struct Node{struct Node* next;int val;};
}
int main()
{hu::Node* node = (hu::Node*)malloc(sizeof(hu::Node));node->val = 1;// 這?默認是訪問的是全局的rand函數指針printf("%p\n", rand);// 這?指定hu命名空間中的randprintf("%d\n", hu::rand);printf("%d\n", hu::add(2, 3));printf("%d\n", node->val);return 0;
}
運行結果:
22324c10bcb14253bd32cd323a7362fb.png
namespace只能定義在全局,當然還可以嵌套定義。
代碼展示
namespace HL{namespace H{int rand = 1;int Add(int left, int right){return left + right;}}namespace L{int rand = 2;int Add(int left, int right){return (left + right) * 10;}}
}
int main()
{printf("%d\n", HL::H::rand);printf("%d\n", HL::L::rand);printf("%d\n", HL::H::Add(1, 2));printf("%d\n", HL::L::Add(1, 2));return 0;
}
運行結果:
3194625548764450a138f2503996b648.png
項目工程中多文件中定義的同名namespace會認為是一個namespace,不會沖突。
//頭文件--function1.h
#include <stdio.h>
namespace MyNamespace {void function1() {printf("This is function1 in file1\n");}
}
//頭文件--function2.h
#include <stdio.h>
namespace MyNamespace {void function2() {printf("This is function2 in file2\n");}
}
//測試文件
#include "function1.h"
#include "function2.h"// 聲明函數原型,以便在main函數中調用int main() {MyNamespace::function1();MyNamespace::function2();return 0;
}
8264bc689be24edda6f476c15a24c7f8.png

3.命名空間的使用

編譯查找一個變量的聲明/定義時,默認只會在局部或者全局查找,不會到命名空間里面去查找。所以下面程序會編譯報錯
#include<stdio.h>
namespace bite
{int a = 0;int b = 1;
}
int main()
{// 編譯報錯:error C2065: “a”: 未聲明的標識符printf("%d\n", a);return 0;
}

所以我們要使用命名空間中定義的變量/函數,有三種方式:
? 指定命名空間訪問,項目中推薦這種方式。
? using將命名空間中某個成員展開,項目中經常訪問的不存在沖突的成員推薦這種方式。
? 展開命名空間中全部成員,項目不推薦,沖突風險很大,日常小練習程序為了方便推薦使用。
#include <stdio.h>
namespace N {int a = 520;int b = 1314;
}
int main()
{  // 指定命名空間訪問printf("%d\n", N::a);// using將命名空間中某個成員展開using N::b;printf("%d\n", b);return 0;
}
注意:
C++標準庫都放在?個叫std(standard)的命名空間中

標準庫命名空間: C++標準庫中的所有功能都定義在std命名空間中。你可以使用std::前綴來訪問標準庫中的成員,或者使用using聲明或指令來引入特定的成員。在使用命名空間時,應該考慮到代碼的清晰性和可維護性。雖然using指令可以簡化代碼,但過度使用可能會導致名稱沖突和代碼的不可預測性。因此,最好是在局部作用域或函數內部使用using聲明,而不是在全局作用域或頭文件中使用using namespace指令。

4.C++的輸入輸出

1.<iostream> 是 Input Output Stream 的縮寫,是標準的輸入、輸出流庫,定義了標準的輸入、輸
出對象。
2.std::cin 是 istream 類的對象,它主要面向窄字符(narrow characters (of type char))的標準輸
入流。
3.std::cout 是 ostream 類的對象,它主要面向窄字符的標準輸出流。
4.std::endl 是一個函數,流插入輸出時,相當于插入一個換?字符加刷新緩沖區。
5.<<是流插入運算符,>>是流提取運算符。(C語?還用這兩個運算符做位運算左移/右移)
6.使C++輸入輸出更方便,不需要像printf/scanf輸入輸出時那樣,需要手動指定格式,C++的輸入輸出可以自動識別變量類型(本質是通過函數重載實現的),其實最重要的是C++的流能更好的支持自定義類型對象的輸?輸出。
7.?IO流涉及類和對象,運算符重載、繼承等很多面向對象的知識,這里簡單認識?下C++ IO流的用法。
8.cout/cin/endl等都屬于C++標準庫,C++標準庫都放在一個叫std(standard)的命名空間中,所以要
通過命名空間的使用方式去用他們。
9.一般日常練習中我們可以using namespace std,實際項目開發中不建議using namespace std。
10.這用我們沒有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream>間接包含了。vs系列
編譯器是這樣的,其他編譯器可能會報錯。

代碼展示

#include <iostream>
using namespace std;
int main() {int a = 10;double b = 5.2;char c = 'd';cout << a << " " << b << " " << c << endl;std::cout << a << " " << b << " " << c << std::endl;scanf("%d %lf", &a, &b);printf("%d %lf", a, b);
// 可以?動識別變量的類型cin >> a;cin >> b >> c;cout << a << endl;cout << b << " " << c << endl;return 0;
}

擴展了解部分(提高效率)

#include<iostream>
using namespace std;
int main()
{
// 在io需求?較?的地?,如部分?量輸?的競賽題中,加上以下3?代碼
// 可以提?C++IO效率
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return 0;
}

結束語

本節內容新知識不是很多,著重講了namespace的用法,下節內容將帶來更加有趣的C++知識,歡迎大家的捧場!!!

最后感謝各位友友的支持,友友們動個手指點個贊,留個評論吧!!!

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

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

相關文章

【Linux進階】文件系統8——硬鏈接和符號連接:ln

在Linux下面的鏈接文件有兩種&#xff0c; 一種是類似Windows的快捷方式功能的文件&#xff0c;可以讓你快速地鏈接到目標文件&#xff08;或目錄)&#xff1b;另一種則是通過文件系統的inode 鏈接來產生新文件名&#xff0c;而不是產生新文件&#xff0c;這種稱為硬鏈接&…

base SAS programming學習筆記10(combine data)

1.一對一合并 基本格式如下&#xff1a; data output-data-set; set data-set1; set data-set2;(data-set1和data-set2可以是相同的數據集&#xff0c;可以添加多個set 語句來實現上述的一對一合并) run; 輸出數據集結果如下&#xff1a; a.會包含所有輸入數據的變量名&#x…

小米手機永久刪除的照片怎么找回?這兩個方法千萬不要錯過!

小米手機永久刪除的照片怎么找回&#xff1f;身為米粉發燒黨的小編又雙叒叕手殘了&#xff01;本來想在手機回收站中恢復一張照片&#xff0c;結果一個稀里糊涂就把照片點成了“永久刪除”。于是乎難得的休班假期&#xff0c;就變成了小編恢復永久刪除照片的漫漫之路。以下是小…

org.springframework.boot.autoconfigure.EnableAutoConfiguration=XXXXX的作用是什么?

org.springframework.boot.autoconfigure.EnableAutoConfigurationXXXXXXX 這一配置項在 Spring Boot 項目中的作用如下&#xff1a; 自動配置類的指定&#xff1a; 這一配置將 EnableAutoConfiguration 設置為 cn.geek.javadatamanage.config.DataManageAutoConfiguration&…

【2024_CUMCM】TOPSIS法(優劣解距離法)

目錄 引入 層次分析法的局限性 簡介 例子 想法1 想法2 運用實際分數進行處理 想法3 問題 擴展問題&#xff1a;增加指標個數 極大型指標與極小型指標 統一指標類型-指標正向化 標準化處理 計算公式 計算得分 對原公式進行變化 升級到m個指標和n個對象 代碼 …

系統分析師-基礎知識

基礎知識 一、計算機組成與結構1、計算機系統基礎知識1.1 計算機硬件組成1.2 中央處理單元&#xff08;CPU&#xff09;1.3 數據表示1.3.1 R進制轉十進制&#xff1a;1.3.2 十進制轉R進制&#xff1a; 1.4 校驗碼&#xff08;3種校驗碼&#xff09;1.4.1 基本知識1.4.2 奇偶校驗…

D-DPCC: Deep Dynamic Point Cloud Compression via 3D Motion Prediction

1. 論文基本信息 發布于&#xff1a; 2022 2. 創新點 首先提出了一種端到端深度動態點云壓縮框架(D-DPCC)&#xff0c;用于運動估計、運動補償、運動壓縮和殘差壓縮的聯合優化。提出了一種新的多尺度運動融合(MMF)模塊用于點云幀間預測&#xff0c;該模塊提取和融合不同運動流…

首屆UTON區塊鏈開發者計劃大會在馬來西亞圓滿落幕

7月9日&#xff0c;首屆UTON區塊鏈開發者計劃大會在馬來西亞吉隆坡成功舉辦&#xff01; 來自全球頂尖的行業領袖、技術精英和眾多區塊鏈愛好者參與了此次盛會&#xff0c;也標志著UTON區塊鏈生態進入了一個全新的發展階段。 會上&#xff0c;UTON區塊鏈創始人之一唐毅先生以“…

Python 中什么是遞歸函數,如何編寫遞歸函數?

遞歸是計算機科學中的一種基本概念&#xff0c;它指的是函數調用自身的編程技巧。在Python中&#xff0c;遞歸函數是一種通過調用自身來解決問題的函數。這種方法常用于解決可以被分解為較小相同問題的場景&#xff0c;例如階乘計算、斐波那契數列、全排列生成等。 一、遞歸的…

TCP 握手數據流

這張圖詳細描述了 TCP 握手過程中&#xff0c;從客戶端發送 SYN 包到服務器最終建立連接的整個數據流轉過程&#xff0c;包括網卡、內核、進程中的各個環節。下面對每個步驟進行詳細解釋&#xff1a; 客戶端到服務器的初始連接請求 客戶端發送 SYN 包&#xff1a; 客戶端發起…

添加點擊跳轉頁面,優化登錄和注冊頁路由

一、給注銷按鈕添加點擊跳轉至登錄頁 1、在路由中添加登錄頁路由 2、自定義登錄頁面 3、在app.vue頁面找到下拉框組件&#xff0c;添加點擊事件 4、使用vue-router中的useRoute和useRouter 點擊后可以跳轉&#xff0c;但是還存在問題&#xff0c;路徑這里如果我們需要更改登錄…

Linux——公網 IP別名設置,清屏,刪除別名,在linux中提供alias永久化的方法,命令歷史

#### ipe - 公網 IP別名設置&#xff1a; bash alias ipecurl ipinfo.io/ip [rootserver ~]# alias ipecurl ipinfo.io/ip [rootserver ~]# ipe 113.132.176.202[rootserver ~]# #### c - 清屏&#xff0c;一般使用 ctrl l 快捷鍵&#xff0c;也可以將 clear 命令定義得更短&…

JavaScript 作用域 與 var、let、const關鍵字

目錄 一、JavaScript 作用域 1、全局作用域 2、函數作用域 3、塊級作用域 4、綜合示例 5、總結 二、var、let、const 1、var 關鍵字 2、let 關鍵字 3、const 關鍵字 4、總結 5、使用場景 一、JavaScript 作用域 在JavaScript中&#xff0c;作用域是指程序中可訪問…

訂單到期關閉

文章目錄 前言一、場景&#xff1f;二、使用步驟1.項目配置好rocketmq2.讀入數據 其他方式處理訂單到期關閉定時任務 前言 實習期間在做訂單模塊。遇到過訂單到時關閉的場景。 因為我們在通過回調接收第三方訂單狀態的時候&#xff0c;使用了rocketmq&#xff0c;在遇到訂單超…

叁[3],使用Newtonsoft.Json.dll,異常記錄

開發環境 VS2022/.net6.0/WPF 1&#xff0c;異常1,反序列化數組異常。 convertError:"[{"不拉不拉***************************** 原因&#xff1a;檢查是Json字符串的數組格式異常。 正常數組字符串 "result":[{"key1":"value1"…

神經網絡構成、優化、常用函數+激活函數

Iris分類 數據集介紹&#xff0c;共有數據150組&#xff0c;每組包括長寬等4個輸入特征&#xff0c;同時給出輸入特征對應的Iris類別&#xff0c;分別用0&#xff0c;1&#xff0c;2表示。 從sklearn包datasets讀入數據集。 from sklearn import darasets from pandas impor…

vulnhub-NOOB-1

確認靶機 掃描靶機發現ftp Anonymous 的A大小寫都可以 查看文件 解密 登錄網頁 點擊about us會下載一個壓縮包 使用工具提取 steghide info 目標文件 //查看隱藏信息 steghide extract -sf 目標文件 //提取隱藏的文件 steghide embed -cf 隱藏信息的文件 -ef…

什么樣的開放式耳機好用舒服?南卡、倍思、Oladance高人氣質量絕佳產品力薦!

?開放式耳機在如今社會中已經迅速成為大家購買耳機的新趨勢&#xff0c;深受喜歡聽歌和熱愛運動的人群歡迎。當大家談到佩戴的穩固性時&#xff0c;開放式耳機都會收到一致好評。對于熱愛運動的人士而言&#xff0c;高品質的開放式耳機無疑是理想之選。特別是在近年來的一些騎…

算法學習記錄4

L2-012 關于堆的判斷 def checkHeap(heap, target):if target 0:return heapif heap[target] < heap[(target - 1) // 2]:temp heap[target]heap[target] heap[(target - 1) // 2]heap[(target - 1) // 2] tempheap checkHeap(heap, (target - 1) // 2)return heapdef…

2024.7.7刷題記錄

目錄 一、849. Dijkstra求最短路 I - AcWing題庫 二、850. Dijkstra求最短路 II - AcWing題庫 根據講解視頻寫的代碼 一、849. Dijkstra求最短路 I - AcWing題庫 N 600 MAXL 10010 # 最長邊長 # 稠密圖鄰接矩陣 g [[MAXL] * N for _ in range(N)] dist [MAXL] * N …