C++比起C來新增的拓展

  • 命名空間
  • register
在C語言橫行的時代,爲了加快運行速度,一些關鍵變量會被放入寄存器中,程序代碼請求編譯器把變量存入寄存器,然而C語言版的寄存器變量沒法經過地址得到register變量。
c++仍然支持關鍵字register
#include "iostream"
#include<string>
using namespace std;
void main()
{
    for (int i = 0; i < 10000; i++)
    {
        printf("%d\n", i);//這種狀況下就會把i放入寄存器,由於i被頻繁使用
    }
    system("pause");
}
#include "iostream"
#include<string>
using namespace std;
void main()
{
  register string a = "陳培昌";
  printf("變量地址爲%d\n", &a);
  system("pause");
}

輸出結果:ios

 

  •  變量檢測的加強
#include "iostream"
#include<string>
using namespace std;
void main()
{
    string a;
    string a = "陳培昌";
    printf("教練姓名%s\n", a);
    system("pause");
}

所謂變量檢測的加強就是c++不容許重複聲明變量,而C能夠(不過windows下vs2013報錯,由於c/c++一直在避免這種二義性)c++

  • struct加強

C語言中,struct結構是一組變量的集合,不認爲它是一種新的類型,說的通俗點windows

#include<stdio.h>
struct mycoach
{
    char name[100];
    int age;
};

void main()
{
    struct mycoach cpc;//不加struct關鍵字報錯
}

C++中數據結構

struct mycoach
{
    string name;
    int age;
};
void main()
{
    mycoach cpc;//竟然能夠
    system("pause");
}

一些狀況下,struct跟類有殊途同歸之妙函數

#include "iostream"
#include<string>
using namespace std;
struct mycoach
{
public:
    string name;
    int age;
private:
    string favorite;
};
void main()
{
    mycoach cpc;
    system("pause");
}
  • c++對數據類型的檢查更嚴格(不管變量仍是函數都需聲明數據類型)
  • 新增了數據類型bool
#include "iostream"
#include<string>
using namespace std;

void main()
{
    bool w=true;
    printf("布爾變量長度%d\n", sizeof(w));
    w = -9;
    printf("布爾值爲%d\n", w);
    w = 8;
    printf("布爾值爲%d\n", w);
    w = 0;
    printf("布爾值爲%d\n", w);
    system("pause");
}

若是多個布爾值同時聲明,可能佔用一個bit,取決於編譯器的實現spa

bool b2,b3,b4;3d

  • 三目運算符的加強
C語言中,表達式的返回值放到了CPU寄存器裏面,是一個值(數),而c++返回的是變量的自己

c++指針

void main()
{
    int a = 20;
    int b = 10;
    (a < b ? a : b) = 30;//至關於執行b=30;
    printf("值b爲:%d\n", b);
    system("pause");
}

然而c語言中code

 

 究其緣由是C語言返回了b的值,因此(a<b?a:b)=30最後執行的命令是10=30;這樣一來操做就變得毫無心義;聽說這個例子是說明C和c++編譯器不一樣的有力案例blog

c++如何作到的?看來是返回了地址......,因此c語言的代碼不妨修改以下:

#include<stdio.h>

void main()
{
    int a = 20;
    int b = 10;
    *(a < b?&a :&b) = 30;
    printf("值b爲:%d\n", b);
    system("pause");
}

輸出結果:

 

  •  const用法
#include<iostream>
using namespace std;
struct mycoach
{
    string name;
    int age;
};

int opcoach01(mycoach* const pt)
{
    //指針變量自己不能被修改
    pt->name = "陳培昌";
    pt = NULL;
}

int opcoach02(const mycoach *pt)
{
    //指針指向的內存空間不能被修改
    pt->name = "陳培昌";
}

輸出結果:

 

 

 

 

 

 

#include<stdio.h>

void main()
{
    const int a = 20;
    a = 30;
    printf("值a爲:%d\n", a);
    system("pause");
}

輸出結果:

然而:

#include<stdio.h>

void main()
{
    const int a = 20;
    int *p = NULL;
    p =&a;
    *p = 30;
    printf("值a爲:%d\n", a);
    getchar();
}

這樣一來:

 

 所以在c語言中const是個僞常量;而c++沒法這樣修改,由於c++編譯器掃描到const類型時,並不像c語言那樣爲其分配內存,而是放入符號表(一種鍵值對類型的數據結構)

有別於C語言內存四區

c++編譯器掃描到對常量取地址操做時,爲常量分配內存空間
或者const變量做爲一種全局變量使用時,也會分配內存空間

c++ const類型實現機制

 

 取值時,從符號表裏讀取a對應的變量

執行 p=int(*)&a操做時,另開闢了一塊空間,讓整型指針p指向這塊空間的地址

下列代碼證明p指向的空間存在

#include<iostream>
using namespace std;
void main()
{
    const int a = 30;
    int *p = NULL;
    p = (int*)&a;
    *p = 40;
    printf("a的值依舊是:%d\n",a);
    cout << "p指向的空間真實存在,其內存地址是" << p << "值是:" << *p<<endl;
    system("pause");
}

輸出結果:

相關文章
相關標籤/搜索