C++基础01-C++对c的增强
所謂namespace,是指標識符的各種可見范圍。C++標準程序庫中的所 有標識符都被定義于一個名為std的namespace中。
一 :<iostream>和<iostream.h>格式不一樣,前者沒有后綴,實際上, 在你的編譯器include文件夾里面可以看到,二者是兩個文件,打開文件就會發現,里面的代碼是不一樣的。后綴為.h的頭文件c++標準已經明確提出不支持了,早些的實現將標準庫功能定義在全局空間里,聲明在帶.h后綴的頭文件 里,c++標準為了和C區別開,也為了正確使用命名空間,規定頭文件不使用后綴.h。 因此,
1)當使用<iostream.h>時,相當于在c中調用庫函數,使用的是全局命名空間,也就是早期的c++實現;
2)當使用<iostream>的時候,該頭文件沒有定義全局命名空間,必須 使用namespace std;這樣才能正確使用cout。
最方便的就是使用using namespace std; 例如: using namespace std;這樣命名空間std內定義的所有標識符都有效(曝光)。就好像它們被聲明為全局變量一樣。那么以上語句可以如下寫: cout <<hex << 3.4 << endl;因為標準庫非常的龐大,所以程序員在選擇的類的名稱或函數名時就很有可能和標準庫中的某個名字相同。所以為了避免這種情況所造成的名字沖突,就把標準庫中的一切都被放在名字空間std中。但這又會帶來了一個新問 題。無數原有的C++代碼都依賴于使用了多年的偽標準庫中的功能,他們都是在全局空間下的。所以就有了<iostream.h> 和<iostream>等等這樣的頭文件,一個是為了兼容以前的C++代碼,一個是為了支持新的標準。命名空間std封裝的是標準程序庫的名稱,標準程序庫為了和以前的頭文件區別,一般不加".h"
namespace nA{}? 不能定義在函數中 只能是全局變量?
//當使用<iostream.h>時,相當于在c中調用庫函數,使用的是全局命
? ? ?//名空間,也就是早期的c++實現;
//當使用<iostream>的時候,該頭文件沒有定義全局命名空間,必須
? ? //使用namespace std;這樣才能正確使用cout。
//C++定義變量隨用隨定義
//C中最好都定義在主函數開始位置
//C++對全部變量的檢測增強(不可重復定義)
//C語言中ok
//C++中的struct是?個新類型的定義聲明
//C語?的struct定義了?組變量的集合,C編譯器并不認為這是?種新的類型
? ?//如若沒有typedef必須用struct進行變量聲明
//C++中所有的變量和函數都必須有類型
//C語?中的默認類型int在C++中是不合法的
//C++更加強調類型,任意的程序元素都必須顯示指明類型
//C++在C語?的基本類型系統之上增加了bool
//C++中的bool可取的值只有true和false.理論上bool只占??個字節
//true代表真值,編譯器內部?1來表? false代表?真值,編譯器內部?0來表?
//bool類型只有true(?0)和false(0)兩個值
//C++編譯器會在賦值時將?0值轉換為true,0值轉換為false
//C語言中的三目運算符返回的是變量值,不能作為左值使用
//C++中的三目運算符可直接返回變量本身,因此可以出現在程序的任何地方,可以作為左值
(a > b ? a : b )= 50; ?//正確,C++中的三目運算符可直接返回變量本身,可以作左值
//(a > b ? 10 : 20) = 50; 10和20是自變量,不能修改,沒有內存地址
//C++中的const修飾的,是一個真正的常量,而不是C中變量(只讀)。在
//const修飾的常量編譯期間,就已經確定下來了
//C++中的const常量與宏定義不同
//const常量是由編譯器處理的,提供類型檢查和作用域檢查
//宏定義由預處理器處理,單純的文本替換
//c 語言中枚舉本質就是整型, 枚舉變量可以用任意整型賦值。而 c++中枚舉
//變量, 只能用被枚舉出來的元素初始化。
?c語言.c? 文件:
#include<stdio.h> #if 1 void test01() {int a = 10;printf("%d\n", a);int b = 20; } int g_val; //分配到bss段 int g_val = 10; void test02() {printf("%d\n", g_val); }struct student1 {char name[64];int id; }; typedef struct student2 {char name[64];int id; }; typedef struct Student3 {char name[64];int id; }student3;void test03() {struct student1 s1;//student2 s2; 錯誤student3 s3; }f() {return 10; } void test04() {f(); //ok }g(int a) {return a; } void test05() { g(10,20,30);//ok }void test07() {int a = 10;int b = 20;int c = 0;//左值 右值//左值//右值c = a > b ? a : b;printf("%d\n", c);//(a > b ? a : b )= 50; 錯誤 (a > b ? a : b)返回的是一個具體數值//10=50; 錯誤*(a > b ? &a : &b) = 50; //(a > b ? &a : &b) 返回的是a的地址 *a間接操作a的地址printf("a=%d\n", a);printf("a=%p\n", a);} void test08() {/*const int a;int const a; //等價,都表示a是一個常量 只讀 不可修改 棧區const int *c;const int* c; //等價于(const int)*c;指針存放地址指向的內容不可以修改//指針指向可以修改int* const c; //等價于int(* const c); 指針指向是int,指針本身是const//指針指向不可以改變,但是指針存放地址指向的內容可以改變const int* const c; //指針指向不可以改變,指針存放地址指向的內容不可以改變*/const int a = 10; //a雖然用const修飾,但是變量//int array[a] = { 0 }; a是變量,所以報錯int *p = &a;*p = 20;printf("%d", a); //20}enum season {Spring,Summer,Autumn,Winter1,Winter2,Winter3,Winter4, }; void test09() {enum season s = Winter3;if (s == 5) {printf("%d", s); //5}s = Winter4;if (s == 64) {printf("%s", s);} } int main(void) {/*test01();test02();test03();test04();test05();test06();test07();test08();*/test09();return 0; } #endifc++語言.cpp:
//當使用<iostream.h>時,相當于在c中調用庫函數,使用的是全局命//名空間,也就是早期的c++實現; //當使用<iostream>的時候,該頭文件沒有定義全局命名空間,必須//使用namespace std;這樣才能正確使用cout。//C++定義變量隨用隨定義 //C中最好都定義在主函數開始位置//C++對全部變量的檢測增強(不可重復定義) //C語言中ok//C++中的struct是?個新類型的定義聲明 //C語?的struct定義了?組變量的集合,C編譯器并不認為這是?種新的類型//如若沒有typedef必須用struct進行變量聲明//C++中所有的變量和函數都必須有類型 //C語?中的默認類型int在C++中是不合法的 //C++更加強調類型,任意的程序元素都必須顯示指明類型//C++在C語?的基本類型系統之上增加了bool //C++中的bool可取的值只有true和false.理論上bool只占??個字節 //true代表真值,編譯器內部?1來表? false代表?真值,編譯器內部?0來表? //bool類型只有true(?0)和false(0)兩個值 //C++編譯器會在賦值時將?0值轉換為true,0值轉換為false//C語言中的三目運算符返回的是變量值,不能作為左值使用 //C++中的三目運算符可直接返回變量本身,因此可以出現在程序的任何地方,可以作為左值//C++中的const修飾的,是一個真正的常量,而不是C中變量(只讀)。在 //const修飾的常量編譯期間,就已經確定下來了 //C++中的const常量與宏定義不同 //const常量是由編譯器處理的,提供類型檢查和作用域檢查 //宏定義由預處理器處理,單純的文本替換//c 語言中枚舉本質就是整型, 枚舉變量可以用任意整型賦值。而 c++中枚舉 //變量, 只能用被枚舉出來的元素初始化。 #if 1 #include<iostream> using namespace std; void test01() {int i = 0;for (int i = 0; i < 10; i++){}int b = 20;cout << b << endl; } /* int g_val; int g_val = 10; 重復定義ERROR void test02() {cout << g_val << endl; } */struct student {char name[64];int id; };void test03() {student s1; }/* f() { //沒有返回類型 錯誤return 10; } void test04() {f();//沒有返回類型 錯誤g(10,20); //報錯 }*//* g(int a) {return a; } void test05() {g(10, 20); //報錯 缺少參數 }*/void test06() {bool flag = true;cout << flag << endl; //1flag = false;cout << flag << endl; //0flag = 3;cout << flag << endl; //1flag = -3;cout << flag << endl; //1cout<<"sizeof(flag):" << sizeof(flag) << endl; }void test07() {int a = 10;int b = 20;int c = 0;//左值 右值//左值//右值cout << "a=" << a << endl; //10cout << "b=" << b << endl; //20c = a > b ? a : b;cout << c << endl; //20cout << "a=" << a << endl; //10cout << "b=" << b << endl; //20(a > b ? a : b )= 50; //正確,C++中的三目運算符可直接返回變量本身,可以作左值cout <<"a="<< a << endl; //10cout << "b="<<b << endl; //50 }void test08() {const int a = 10; //a是真正的常量int array[a] = { 0 }; //可以通過編譯int *p = (int*)&a; //如果對常量取地址,編譯器會臨時開辟一個空間temp,指針指向temp*p = 20; //改變的時臨時開辟的temp變量cout << "a=" << a << endl; //10cout << "*p=" << *p << endl; //20 }enum season {Spring,Summer,Autumn,Winter1,Winter2,Winter3,Winter4, }; void test09() {enum season s = Spring;if(s==Spring)cout << s << endl; //0 } int main() {//test06();//test07();//test08();test09(); }#endif?
總結
以上是生活随笔為你收集整理的C++基础01-C++对c的增强的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fx5u以太网通讯设置_操作示例 | 实
- 下一篇: 数据结构排序2-希尔,快速,归并排序