1. 程式人生 > >c++基礎----對c的增強

c++基礎----對c的增強

con c++基礎 height 報錯 並不會 作用域 als nbsp eache

我們都知道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的增強