1. 程式人生 > >C++深度解析 C到C++的升級(1)

C++深度解析 C到C++的升級(1)

C++深度解析 C到C++的升級(1)

 

C++更強調語言的實用性

 

1、所有的變數都可以在需要使用時再定義

(對比:C語言中的變數都必須在作用域開始的位置定義)

int c = 0;

for (int i =1; i <= 3; i++)
{
	for(int j = 1; j <= 3; j++)
	{
		c += i * j;
	}
}

 

 

2、register關鍵字請求編譯器將區域性變數儲存於暫存器中

2.1 在C++中依然支援register關鍵字

2.2 C++編譯器有自己的優化方式

2.3 C語言無法獲取register變數的地址

2.4 C++中可以取得register變數的地址

2.5 C++編譯器發現程式中需要取register變數地址時,register對變數的宣告變得無效

 

 

3、C++拒絕二義性的做法

3.1 在C語言中,重複定義多個同名的全域性變數是合法的

(C語言中多個同名的全域性變數最終會被連結到全域性資料區的同一個地址空間上)

3.2 在C++中,不允許定義多個同名的全域性變數

示例程式碼如下:

#include <stdio.h>

//全域性變數
int g_v;
//int g_v; //拒絕同名的變量出現

int main(int argc, char *argv[])
{
	printf("Begin...\n");

	int c = 0;//如果是C,要在main函式作用域起始位置定義

	for (int i = 1; i <= 3; i++)//int i
	{
		for(int j = 1; j <= 3; j++)
		{
			c += i *j;
		}
	}

	printf("c = %d\n", c);

	//在c++,忽略register,不可能取到暫存器的地址
	register int a = 0;

	printf("&c = %p\n", &a);

	printf("End...\n");

	return 0;
}

 

 

4、struct 關鍵字的加強

4.1 c語言中的struct定義了一組變數的集合

4.2 C語言中structdi定義的識別符號並不是一種新的型別

4.3 C++中的struct用於定義一個全新的型別

C++:

//定義了一個名為Student的新型別
struct Student
{
	const char* name;
	int age;
};

C語言:

typedef struct _tag_student Student;
struct _tag_student
{
	const char* name;
	int age;
};

 

 

5、面試題:int f()和int f(void)有區別嗎?

它們有沒有區別,具體看用什麼編譯器。

C++中,所有的識別符號都必須顯示的宣告型別

5.1 在C語言中:

int f()表示返回值為int,接受任意引數的函式

f(void)表示fa返回值為int的無參函式,不接受任何引數

5.2 在C++中:

int f()和int f(void)具有相同的意義,不接受任何引數,表示返回值為int的無參函式

 

示例程式碼:

#include <stdio.h>

//Student代表新的型別名
struct Student
{
	const char* name;
	int age;
};

/*
f(i) // int f(int i)
{
	printf("i = %d\n", i);
}

g()
{
	return 5;
}
*/

int main(int argc, char *argv[])
{
	Student s1 = {"Delphi", 38};
	Student s2 = {"Tang", 38};

	//f(10);

	//printf("g() = %d\n", g(1, 2, 3, 4, 5));

	return 0;
}

 

 

6、小結:

C++更強調實用性,可以在任意的地方宣告變數

C++中的register只是一個相容的作用

C++編譯器能夠更好的進行優化

C++中的任意識別符號都必須顯示的指明型別