C++中const和#define的利弊探索

const和#define的利弊,從而推導const的意義;ios

const和#define都有相似的功能,那就是定義一個「常量」;安全

想用來替換#define定義常量這種方式。這是一種定義宏的方式。由於宏替換定義常量有必定的缺陷:不作類型檢查,沒有做用域限制(這樣很容易被後續污染)。函數

#include<iostream>
#include<string>
using namespace std;

void myfunc1() {
	#define a 10
}

void myfunc2() {
	printf("a=%d\n", a);
}

int main() {
	printf("外面打印:a=%d\n", a);
	myfunc1();
	myfunc2();

	system("pause");
	return 0;
}

由於只作字面上的直接替換,全局都有效,因此不管定義在哪裏,全局均可以訪問。由於是在預編譯的時候就替換好了(只要有定義,就在預編譯的時候進行全程替換,因此外面裏面均可以訪問)。spa

同時,很容易受到污染。code

#include<iostream>
#include<string>
using namespace std;

#define a 10

void myfunc1() {
	#define a 20
	printf("myfunc1裏面的:a=%d\n", a);
}

void myfunc2() {
	printf("myfunc2裏面的:a=%d\n", a);
}

int main() {
	printf("外面打印:a=%d\n", a);
	myfunc1();
	myfunc2();

	system("pause");
	return 0;
}

提示有宏重定義,結果所有都改變爲新的:內存

宏的方式至關於全局變量,不管在函數裏仍是函數外命名的時候都要精心雕琢(有點頭痛),不然很容易在之後新的函數中不當心被替換掉,這就是爲何用它定義常量都基本上所有大寫,而變量都弄成小寫,這樣既然不記得有多少宏名了,也不至於衝突。可是它的全局性仍是沒有解決。作用域

而const由於有做用域限制,解決了污染全局變量的困擾。開發

下面的程序是不行的:string

#include<iostream>
#include<string>
using namespace std;

void myfunc1() {
	const int a = 20;
	printf("myfunc1裏面的:a=%d\n", a);
}

void myfunc2() {
	printf("myfunc2裏面的:a=%d\n", a);
}

int main() {
	printf("外面打印:a=%d\n", a);
	myfunc1();
	myfunc2();

	system("pause");
	return 0;
}

定義個全局的只讀變量:io

#include<iostream>
#include<string>
using namespace std;

const int a = 10;
void myfunc1() {
	const int a = 20;
	printf("myfunc1裏面的:a=%d\n", a);
}

void myfunc2() {
	printf("myfunc2裏面的:a=%d\n", a);
}

int main() {
	printf("外面打印:a=%d\n", a);
	myfunc1();
	myfunc2();

	system("pause");
	return 0;
}

裏面的既不干擾外面的,還能夠有優先級之分,同時要作全局也能夠作全局。

這樣新作的函數中要想使用a這個名字了,不用考慮什麼,直接用就是了。不會影響之前外面定義的全局變量a,是否是省事的多啊。

const是隻讀變量,本質上仍是變量,是變量就能夠傳遞參數,而const還作類型檢查,因此好處更多,如:作形參,能夠接收不一樣的參數,更靈活。

你不能在裏面把個人變量給改了吧,能夠傳遞不一樣的變量,所以就曉得更靈活了;

#include<iostream>
#include<string>
using namespace std;

void myfunc1(const int k) {
	printf("myfunc1裏面的數據=%d\n", k);
}

int main() {
	const int a = 20;
	myfunc1(a);

	const int b = 30;
	myfunc1(b);

	system("pause");
	return 0;
}

const的應用:

因爲是隻讀變量,所以保護了外面的實參,外面傳遞實參進來,在函數體裏不能修改。所以讓外面的實參獲得安全性考慮。

#include<iostream>
#include<string>
using namespace std;

void myfunc1(const int* k) {
	*k = 3;
	printf("myfunc1裏面的數據=%d\n", k);
}

int main() {
	const int a = 20;
	myfunc1(&a);

	system("pause");
	return 0;
}

宏替換的方式至關於弄全局變量,很容易被污染,沒有做用域限制,作不了優先級區分。它是在預編譯的時候就被替換了。

而const是在編譯的時候才分配變量,有做用域區分,和類型一致的安全性檢測,應用const來開發項目更方便靈活...

宏替換定義的是常量,一定全局有效;

const定義的是隻讀變量,有做用域之分,能夠作全局的,也能夠作局部的,還有優先級之分。既方便又安全,能夠代替#define了。那爲何都存在?由於也都有好處,只是想拿各自的好處罷了:

宏替換的方式,讓整個編譯過程變慢(預編譯時間+真正編譯的時間),可是讓程序運行速度變快,由於早已直接替換好了(宏展開),直接運行就得了。

 

const和它相反,整個編譯時間少,可是程序運行速度慢點了,由於要找內存空間開闢變量...

相關文章
相關標籤/搜索