C++?命名空間與輸入輸出操作代碼
前言
C++是一種面向?qū)ο蟮挠?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,它擴(kuò)展了C語(yǔ)言的功能,并引入了面向?qū)ο缶幊痰母拍睿?zwnj;如類、繼承和多態(tài)等,C++是以C語(yǔ)言為基礎(chǔ)進(jìn)行了拓展與創(chuàng)新,C++兼容C語(yǔ)言絕大多數(shù)的語(yǔ)法。
還記得我們?cè)趯W(xué)C語(yǔ)言時(shí)的第一個(gè)代碼程序嗎?
#include<stdio.h> int main() { printf("hello world\n"); return 0; }
C++也兼容這種寫(xiě)法,但是C++有?套自己的輸入輸出,嚴(yán)格說(shuō)C++版本的hello world應(yīng)該是這樣寫(xiě)的。
#include<iostream> using namespace std; int main() { cout << "hello world\n" << endl; return 0; }
現(xiàn)在還不認(rèn)識(shí)不要緊,本篇會(huì)講解C++的一些基礎(chǔ)知識(shí), 看完后就明白是怎么一回事了。
一、命名空間
1.1 namespace的價(jià)值
c語(yǔ)言項(xiàng)目類似下面程序這樣的命名沖突是普遍存在的問(wèn)題,C++引入namespace就是為了更好的解決這樣的問(wèn)題。
#include <stdio.h> #include <stdlib.h> int rand = 10; int main() { printf("%d\n", rand); return 0; }
這里我們可以看到編譯器報(bào)錯(cuò)了,因?yàn)樵趕tdlib頭文件中包含一個(gè)名為rand的函數(shù)與定義的變量rand發(fā)生了命名沖突。在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用域中,可能會(huì)導(dǎo)致很多沖突,使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對(duì)這種問(wèn)題的。
1.2 namespace的定義
• 定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接?對(duì){}即可,{}中即為命名空間的成員,命名空間中可以定義變量/函數(shù)/類型等。
• namespace本質(zhì)是定義出?個(gè)域,這個(gè)域跟全局域各自獨(dú)立,不同的域可以定義同名變量,所以下面的rand不再?zèng)_突了。
#include <stdio.h> #include <stdlib.h> // otto是命名空間的名字 namespace otto { // 命名空間中可以定義變量/函數(shù)/類型 int rand = 10;//變量 int Add(int left, int right)//函數(shù) { return left + right; } class otto//類 { public: void man() { return; } private: int x; }; } int main() { printf("%p\n", rand); printf("%d\n", otto::rand); return 0; }
第一個(gè)printf默認(rèn)訪問(wèn)的是全局的rand函數(shù)地址,第二個(gè)printf用到的是otto命名空間里的rand,這樣就解決了命名沖突的問(wèn)題。
• C++中域有函數(shù)局部域,全局域,命名空間域,類域;域影響的是編譯時(shí)語(yǔ)法查找?個(gè)變量/函數(shù)/ 類型聲明或定義的邏輯,所有有了域隔離,命名沖突就解決了,局部域和全局域除了會(huì)影響 編譯查找邏輯,還會(huì)影響變量的生命周期,命名空間域和類域不影響變量生命周期。
• namespace只能定義在全局,當(dāng)然他還可以嵌套定義。
namespace otto { namespace kun { int rand = 1; int Add(int left, int right) { return left + right; } } } int main() { printf("%d\n", otto::kun::rand); printf("%d\n", otto::kun::Add(1, 2)); return 0; }
• 項(xiàng)目工程中多文件中定義的同名namespace會(huì)認(rèn)為是?個(gè)namespace,不會(huì)沖突。
• C++標(biāo)準(zhǔn)庫(kù)都放在?個(gè)叫std(standard)的命名空間中。
1.3 命名空間的使用
編譯查找?個(gè)變量的聲明/定義時(shí),默認(rèn)只會(huì)在局部或者全局查找,不會(huì)到命名空間里面去查找,所以下面程序會(huì)編譯報(bào)錯(cuò),
namespace N { int a = 0; int b = 1; } int main() { printf("%d\n", a); return 0; }
所以我們要使用命名空間中定義的變量/函數(shù),有三種方式:
• 指定命名空間訪問(wèn),項(xiàng)目中推薦這種方式。
int main() { printf("%d\n", N::a); return 0; }
通過(guò)“命名空間+::”的方式在指定命名空間訪問(wèn)。
• using將命名空間中某個(gè)成員展開(kāi),項(xiàng)目中經(jīng)常訪問(wèn)的不存在沖突的成員推薦這種方式。
using N::b; int main() { printf("%d\n", N::a); printf("%d\n", b); return 0; }
展開(kāi)后使用這個(gè)變量時(shí)就不用帶命名空間了。
• 展開(kāi)命名空間中全部成員,項(xiàng)目不推薦,沖突風(fēng)險(xiǎn)很大,日常小練習(xí)程序?yàn)榱朔奖阃扑]使用。
using namespce N; int main() { printf("%d\n", a); printf("%d\n", b); return 0; }
二、C++輸入&輸出
• <iostream>是Input Output Stream 的縮寫(xiě),是標(biāo)準(zhǔn)的輸入、輸出流庫(kù),定義了標(biāo)準(zhǔn)的輸入、輸 出對(duì)象。
• std::cin是 istream 類的對(duì)象,它主要面向窄字符的標(biāo)準(zhǔn)輸入流。
• std::cout 是 ostream 類的對(duì)象,它主要?向窄字符的標(biāo)準(zhǔn)輸出流。
• std::endl 是?個(gè)函數(shù),流插入輸出時(shí),相當(dāng)于插入?個(gè)換行字符加刷新緩沖區(qū)。
• <<是流插入運(yùn)算符,>>是流提取運(yùn)算符。
• 使?C++輸?輸出更方便,不需要像printf/scanf輸?輸出時(shí)那樣,需要手動(dòng)指定格式,C++的輸入輸出可以自動(dòng)識(shí)別變量類型,其實(shí)最重要的是 C++的流能更好的支持自定義類型對(duì)象的輸入輸出。
• IO流涉及類和對(duì)象,運(yùn)算符重載、繼承等很多面向?qū)ο蟮闹R(shí),這些知識(shí)我們還沒(méi)有講解,所以這里我們只能簡(jiǎn)單認(rèn)識(shí)?下C++ IO流的用法,后面會(huì)有專門的?個(gè)章節(jié)來(lái)細(xì)節(jié)IO流庫(kù)。
• cout/cin/endl等都屬于C++標(biāo)準(zhǔn)庫(kù),C++標(biāo)準(zhǔn)庫(kù)都放在?個(gè)叫std(standard)的命名空間中,所以要 通過(guò)命名空間的使用方式去用他們。
• ?般日常練習(xí)中我們可以using namespace std,實(shí)際項(xiàng)目開(kāi)發(fā)中不建議使用
• 這里我們沒(méi)有包含,也可以使用printf和scanf,在包含間接包含了。vs系列編譯器是這樣的,其他編譯器可能會(huì)報(bào)錯(cuò)。
#include <iostream> using namespace std; int main() { int a ; double b; char c ; // 可以自動(dòng)識(shí)別變量的類型 cin >> a; cin >> b >> c; cout << a << endl; cout << b << " " << c << endl; return 0; }
到此這篇關(guān)于C++ 命名空間與輸入輸出的文章就介紹到這了,更多相關(guān)C++ 命名空間與輸入輸出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt圖形圖像開(kāi)發(fā)之曲線圖表庫(kù)QChart編譯安裝詳細(xì)方法與使用實(shí)例
這篇文章主要介紹了Qt圖形圖像開(kāi)發(fā)之曲線圖表庫(kù)QChart編譯安裝詳細(xì)方法與使用實(shí)例,需要的朋友可以參考下2020-03-03C++實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03簡(jiǎn)述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制
這篇文章主要介紹了簡(jiǎn)述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-08-08VS Code 中搭建 Qt 開(kāi)發(fā)環(huán)境方案分享
這篇文章主要介紹了VS Code 中搭建 Qt 開(kāi)發(fā)環(huán)境方案分享的相關(guān)資料,需要的朋友可以參考下2022-12-12解析C++中四種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳解
本篇文章是對(duì)C++中四種強(qiáng)制類型轉(zhuǎn)換的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法詳細(xì)講解
這篇文章主要介紹了C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-11-11C語(yǔ)言使用鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言使用鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12