c++基礎----對c的增強
我們都知道c++是完全兼容c的,而且對c做了一定的優化。
c++與c的不同在於:
1.實用性的增強:變量可以任意定義了
在c中:變量的定義必須在函數使用之前,不然在有些早期的編譯器中可能出錯。
int i = 0; for (i = 0; i < 10; i++) { }
//int b;//error
在c++中:變量可以任意定義,不過要註意變量的作用域和生存周期。
for (int i = 0; i < 10; i++) { //***這裏的i隨for循環的結束而被釋放 int temp=1; }
int b=2;
2..對全局變量檢測能力的增強:不允許有重定義的現象出現
在c++中:一個變量不管是聲明還是定義只能出現一次
//int g_val;
//int g_val=10;
//這樣定義在C語言不會報錯,但在c++中會出錯
3.對struct增強
在c中
struct teacher { int id; char name[64]; }; void test2() { //在c語言中只能struct teacher t;這樣定義除非加上typedef //而在c++可以這樣: //teacher t; }
4.對函數檢測增強
c++中對形參傳遞,返回值做了嚴格的檢查,不允許任意傳,任意調用,必須有返回值。
而在c則可以任意,不過一般按照規範去寫。
void f(int i) { cout << i << endl; } void test3() { f(1); //在c中這樣不會報錯(warning),而在c++中這樣會報錯(error)。 //f(1, 2, 3); }
5.新增bool類型
在C語言中:非0代表真,0代表假
int flag =1;//真 int flag=-1;//真 int flag=0;//假
在c++中新增了一個bool變量,bool變量的值只有0或1.
bool flag = true; flag = false;//true--真,false--假 cout << "bool的size="<<sizeof(flag) << endl;//1個字節 cout << "flag=" << flag << endl;//為true值為1,為false值為0,不管為bool類型賦非0值則為1(true),bool值只有0/1
6.對三目運算符的增強
在c中:a > b ? a : b = 30一般會編譯出錯。原因是a > b ? a : b返回的是10,10=30會出錯
而在c++:a > b ? a : b返回的是對b的引用。
不過要註意:a > b ? a : b作為左值時返回的結果不能有常量(常量不能取地址)。做右值時任意
//c中: void test5() { int a = 10; int b = 20; int max = a > b ? a : b; printf("%d\n",max); //c++: a > b ? a : b = 30;//在c中這個會出錯20=30沒有意義,在c++中可以使用a > b ? a : b 返回b變量的引用*(a>b?&a:&b)=30 cout << "b=" << b << endl;//30 //a > b ? 10 : b = 30;//error,作為左值時返回的結果不能有常量(常量不能取地址)。做右值時任意 }
7.const增強
在c中:
1)const並不是一個常量,是一個變量加了只讀屬性.
2)const int 和int const是一樣的。
3)const修飾的變量實際上是可以通過指針改變的。是一個假的常量
int const a = 1; const int b=1; int *p = (int*)&a; *p = 20;
4)與#define是有區別的。#define在預編譯時處理,const在編譯時處理。
在c++中:
1)const修飾表示的就是常量。
const int a=1;這在c++中並不會在棧空間中開辟空間,而在內存中會有一個符號表去記錄key---value.
2)a實際上是一個符號,是不能去訪問地址的,但c++發現對一個const常量符號取地址時,會臨時在棧上開辟一個臨時空間,這個變量是匿名的。p-->臨時變量
*p改變的是臨時變量,而不是常量a.
3)const做參數使用:
const teacher *t:const teacher指針可動,指針指向的常量不可變
teacher * const t:teacher * const指針不可動,指針指向的常量可變
const teacher * const t:指針不可動,指針指向的常量不可變
說明圖:
void change_teacher1(teacher *t) { t->id = 10; } void change_teacher2(const teacher *t) { //t->id = 10;//此時t指向的一個區域為常量不能被修改 teacher t2; t = &t2; } void change_teacher3(teacher *const t) { t->id = 10; //teacher t2; //t = &t2;//t是一個常量指針,不能修改 } void change_teacher4(const teacher *const t) { //t->id = 10;//此時t指向的一個區域為常量不能被修改 //teacher t2; //t = &t2;//t是一個常量指針,不能修改 }
8.enum的增強
在c++中不用在使用enum的值直接給enum變量賦值了。
enum num { a=0,//從0開始累加,不寫默認為0開始. b, c, d }; void test8() { enum num n = a; /*n = 0; n = 1; n = 2; n = 3;*/ //在c語言中給枚舉類型賦值時,可以通過枚舉值賦值,而在c++中不可以 }
c++基礎----對c的增強