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和它相反,整個編譯時間少,可是程序運行速度慢點了,由於要找內存空間開闢變量...