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