wordpress怎么做淘客網(wǎng)站百度瀏覽器官網(wǎng)在線使用
一、歷史
C++是在C上繼承拓展的!
java是一家公司(甲骨文)借鑒C++生成的!
C#是微軟借鑒java生成的!
二、命名空間
當(dāng)我們定義一個(gè)名叫rand的變量,但是由于stdlib頭文件里面有個(gè)函數(shù)跟rand重名!因此會(huì)發(fā)生命名沖突!
因此為了解決該問(wèn)題,C++引入了命名空間的定義!
同一個(gè)域里面不可以定義同一個(gè)變量!
不同的域里面可以定義同一個(gè)變量!(局部變量訪問(wèn)優(yōu)先)
常見(jiàn)的域有:類(lèi)域、命名空間域、局部域、全局域
#include<stdio.h>
#include<stdlib.h>int a = 0;
int main()
{int a = 1;printf("%d\n", a);printf("%d\n", ::a);return 0;
}
對(duì)于上面這段代碼,?打印的第一個(gè)a為局部變量;第二個(gè)::a為全局變量。
::被稱(chēng)為域作用限定域!
::的左邊為空白!(空格無(wú)影響),表示的就是在全局域訪問(wèn)!
#include<stdio.h>
#include<stdlib.h>
#include<iostream>int a = 0;
namespace bit
{int a = 1;
}
int main()
{// int a = 2;printf("%d\n", a); // 打印結(jié)果為0//printf("%d\n", ::a);return 0;
}
默認(rèn)的訪問(wèn)順序?yàn)?局部域->全局域
如果不指定不會(huì)訪問(wèn)命名空間域!(默認(rèn)不會(huì)的)
#include<stdio.h>
#include<stdlib.h>
#include<iostream>//int a = 0;
namespace bit
{int a = 1;
}
int main()
{// int a = 2;printf("%d\n", a);//printf("%d\n", ::a);return 0;
}
代碼會(huì)直接報(bào)錯(cuò)!
有兩種方法來(lái)訪問(wèn)命名空間域:
- 展開(kāi)了命名空間域!
- 指定訪問(wèn)的的命名空間域!
1、展開(kāi)命名空間域
namespace bit
{int a = 1;
}
// 展開(kāi)命名空間
using namespace bit;
此時(shí)相當(dāng)于將命令空間中的a暴漏在全局域中!
#include<stdio.h>
#include<stdlib.h>
#include<iostream>int a = 0;
namespace bit
{int a = 1;
}
// 展開(kāi)命名空間
using namespace bit;int main()
{printf("%d\n", a);return 0;
}
此時(shí)會(huì)報(bào)錯(cuò),a變量不明確!因?yàn)閮蓚€(gè)變量都位于全局域當(dāng)中!?
2、指定命名空間
#include<stdio.h>
#include<stdlib.h>
#include<iostream>int a = 0;
namespace bit
{int a = 1;
}
// 展開(kāi)命名空間
using namespace bit;int main()
{int a = 2;printf("%d\n", a);printf("%d\n", ::a);printf("%d\n", bit::a);return 0;
}
通過(guò)作用域限定符指定命名空間,從而訪問(wèn)bit命令空間里面的變量!
展開(kāi)指的是編譯時(shí)是否會(huì)去命名空間中搜索!
最好不要輕易將命名空間暴漏給全局域!
3、命名空間的定義
- 正常的命名空間定義
定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可,{}
中即為命名空間的成員。
命名空間中可以定義變量/函數(shù)/類(lèi)型!
namespace bit
{// 命名空間中可以定義變量/函數(shù)/類(lèi)型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
- 命令空間可以嵌套
namespace N1
{int a = 0;int b;int Add(int left, int right){return left + right;}namespace N2{int a = 2;int d;int Sub(int left, int right){return left - right;}}
}
此時(shí)N1和N2的a為兩個(gè)不同的變量!
int main()
{printf("%d\n",N1::a); // 訪問(wèn)N1中的aprintf("%d\n",N1::N2::a); // 訪問(wèn)N2中的aprintf("%d\n",N1::Add(1,2));return 0;
}
- 同一個(gè)工程中允許存在多個(gè)相同名稱(chēng)的命名空間,編譯器最后會(huì)合成同一個(gè)命名空間中。
例如有一個(gè)quequ.h的頭文件定義了如下:
namespace cc
{int x = 0;
}
有一個(gè)stack.h的頭文件定義了如下:
namespace cc
{int y = 0;
}
此時(shí)如果有一個(gè)test.c的文件:
#include"stack.h"
#include"queue.h"int main()
{printf("%d\n",cc::x);printf("%d\n",cc::y);return 0;
}
可以訪問(wèn)x和y!(合并到了一個(gè)命名空間!)
如何解決同一個(gè)命名空間定義變量名相同的變量?
使用命名空間的嵌套!
std標(biāo)準(zhǔn)庫(kù)
std也被稱(chēng)作C++標(biāo)準(zhǔn)庫(kù),包括STL庫(kù)和C++庫(kù)
? ? ? 在C++編程中,using namespace std; 是一條指令,用于告訴編譯器在當(dāng)前作用域中使用標(biāo)準(zhǔn)命名空間(std)。標(biāo)準(zhǔn)命名空間包含了C++標(biāo)準(zhǔn)庫(kù)中的所有函數(shù)、對(duì)象和類(lèi)型,例如cout、cin、vector、string等。?
詳細(xì)解釋
- 命名空間(namespace):
命名空間是C++中的一種機(jī)制,用于防止命名沖突。標(biāo)準(zhǔn)庫(kù)中所有的名稱(chēng)都被定義在命名空間std中。例如,標(biāo)準(zhǔn)輸出流對(duì)象cout的完整名稱(chēng)是std::cout。
- using namespace std;的作用:
當(dāng)你使用using namespace std;時(shí),你告訴編譯器在當(dāng)前作用域中默認(rèn)使用std命名空間中的所有名稱(chēng)。這意味著你可以直接使用cout、cin等,而不需要每次都寫(xiě)std::cout、std::cin。
#include <iostream>using namespace std;int main() {cout << "Hello, World!" << endl;return 0;}
在這個(gè)例子中,由于使用了using namespace std;,我們可以直接使用cout和endl,而不需要寫(xiě)成std::cout和std::endl。?
注意事項(xiàng)
- 命名沖突:
使用using namespace std;可能會(huì)導(dǎo)致命名沖突。如果你的代碼中包含了與標(biāo)準(zhǔn)庫(kù)中名稱(chēng)相同的變量或函數(shù)名,可能會(huì)引發(fā)沖突。例如:
#include <iostream>using namespace std;void sort() {// 自己定義的sort函數(shù)}int main() {sort(); // 這是調(diào)用自己的sort函數(shù)還是標(biāo)準(zhǔn)庫(kù)的sort函數(shù)?return 0;}
在這種情況下,編譯器可能會(huì)產(chǎn)生混淆,不知道你是要調(diào)用標(biāo)準(zhǔn)庫(kù)中的sort函數(shù)還是你自己定義的sort函數(shù)。
推薦做法:
為了避免命名沖突,許多開(kāi)發(fā)者更傾向于在需要使用標(biāo)準(zhǔn)庫(kù)名稱(chēng)時(shí)顯式地使用std::前綴,特別是在大型項(xiàng)目或庫(kù)開(kāi)發(fā)中。
#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;}
這樣可以清楚地知道每個(gè)名稱(chēng)的來(lái)源,減少命名沖突的風(fēng)險(xiǎn)。
總之,using namespace std;?是一個(gè)方便的工具,可以簡(jiǎn)化代碼的書(shū)寫(xiě),但在使用時(shí)需要小心,特別是在大型項(xiàng)目中,以避免潛在的命名沖突。
<iostream> 是 C++ 的一個(gè)頭文件,用于包含輸入輸出流庫(kù)。這個(gè)庫(kù)提供了處理輸入和輸出的功能,例如使用 std::cout 輸出到控制臺(tái),或使用 std::cin 從控制臺(tái)讀取輸入。
總結(jié)來(lái)說(shuō):
- #include<iostream>?用于引入輸入輸出功能。
- using namespace std;?使得可以直接使用?std?命名空間中的標(biāo)識(shí)符,簡(jiǎn)化代碼書(shū)寫(xiě)。
將命名空間中某個(gè)成員引入
using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0; ? ?
}
可以避免將整個(gè)命名空間展開(kāi),造成容易出錯(cuò)
總結(jié):命令空間是為了解決C語(yǔ)言的缺陷:即命名沖突!
三、C++輸入&輸出
std是C++標(biāo)準(zhǔn)庫(kù)的命名空間名,C++將標(biāo)準(zhǔn)庫(kù)的定義實(shí)現(xiàn)都放到這個(gè)命名空間中!
cout << "hello world";
- 相當(dāng)于把"hello world"流入到顯示器當(dāng)中!
- cout和cin是全局的流對(duì)象,endl是特殊的C++符號(hào),表示換行輸出,他們都包含在包含<?
iostream >頭文件中。
cout << "hello world"<<'\n'<<endl;
- 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣,需要手動(dòng)控制格式。
C++的輸入輸出可以自動(dòng)識(shí)別變量類(lèi)型。
C++控制輸出精度和寬度比較復(fù)雜!且不容易記住,建議使用C語(yǔ)言的輸出形式控制精度!
printf的輸出比C++的cout輸出快!
-
緩沖機(jī)制:
printf
?使用的是C標(biāo)準(zhǔn)庫(kù)的?stdio.h
,其輸出是基于緩沖區(qū)的。默認(rèn)情況下,標(biāo)準(zhǔn)輸出是行緩沖的,這意味著輸出會(huì)在遇到換行符時(shí)刷新。cout
?使用的是C++標(biāo)準(zhǔn)庫(kù)的?iostream
,其輸出也是基于緩沖區(qū)的,但它還涉及到對(duì)象和流操作,這可能會(huì)增加一些開(kāi)銷(xiāo)。此外,cout
?默認(rèn)是同步與C的標(biāo)準(zhǔn)輸出流(printf
),這也會(huì)影響性能。
-
同步機(jī)制:
- C++的?
iostream
?庫(kù)默認(rèn)與C標(biāo)準(zhǔn)庫(kù)的?stdio
?同步,以確保混合使用?printf
?和?cout
?時(shí)的輸出順序正確。這種同步機(jī)制會(huì)帶來(lái)額外的性能開(kāi)銷(xiāo)。 - 你可以通過(guò)調(diào)用?
std::ios::sync_with_stdio(false);
?來(lái)禁用這種同步,從而提高?cout
?的性能:?#include <iostream>using namespace std;int main() {ios::sync_with_stdio(false); // 禁用與stdio的同步cout << "Hello, World!" << endl;return 0;}?
- C++的?
-
格式化和類(lèi)型安全:
printf
?是一個(gè)基于格式字符串的函數(shù),它直接操作C風(fēng)格的字符串,效率較高,但缺乏類(lèi)型安全和靈活性。cout
?是類(lèi)型安全的,它使用運(yùn)算符重載來(lái)處理不同類(lèi)型的數(shù)據(jù),這雖然帶來(lái)了更高的靈活性和安全性,但也增加了運(yùn)行時(shí)的開(kāi)銷(xiāo)。
-
模板和流操作:
cout
?使用了模板和流操作,這些都是C++語(yǔ)言特有的高級(jí)特性,雖然提供了更強(qiáng)大的功能和更好的類(lèi)型安全性,但也會(huì)引入額外的開(kāi)銷(xiāo)。