C++引用说明
三目運算符在C++中返回的是變量而不是值,在C語言中返回的是值不是變量,在C++中是通過返回地址再取值達到的返回變量本身
#include <iostream>using namespace std;int main() {int a = 20;int b = 30;(a < b ? a : b) = 10; //C++中三目運算符返回的是變量本身//讓表達式返回一個內存空間,,,,也就是內存的首地址 指針//其實在C++中相當于做了一下的處理* (a < b ? &a : &b) = 50;//其實就是相當于讓表達式返回變量的地址,而不是變量的本身這樣就能夠使用變量的地址改變變量的值 這一部分相當于C++編譯器幫助程序員完成的第一部分 因為當左值必須有內存空間printf("The result of b :%d\n",b);printf("The result of a is %d\n",a);printf("hello world!\n");system("pause"); return 0; } #include <iostream>using namespace std;int main() {const int *c; //const修飾的是指針指向的內存空間不能被修改int * const d; //const修飾的指針不能夠被更改,指針是確定的不能夠更改,但是指針指向的數值是可以被更改的const int * const c;printf("hello world!\n");system("pause"); return 0; }C語言中的const 是一個冒牌貨,因為同樣的代碼在C語言中能夠通過指針修改cosnt的值但是在C++中卻不可以
//在C語言中能夠通過指著修改a的值,運行結果A的值是20 int main() {//好像a是一個常量const int a = 330;int *p = NULL;p = (int *) &a;*p = 20;printf("a = %d\n",a);printf("*p = %d\n",*p);printf("hello world!\n"); return 0; }同樣的代碼在C++中運行的結果A的值依然是330
#include <iostream>using namespace std;int main() {//好像a是一個常量const int a = 330;int *p = NULL;p = (int *) &a; //會從新開辟一段內存,并且這段內存由p指向,但是a還是a,只是按照a的大小和形式開辟內存*p = 20;printf("a = %d\n",a);printf("*p = %d\n",*p); //輸出的是20 *p和a不是一個內存printf("hello world!\n");system("pause"); return 0; }C++語言中的const才是真正的const常量
C++中將const聲明的變量回放在一個符號表中,符號表中是使用鍵值對的即(keey : value)的形式,并且鍵值一旦確定個就不能更改。
const內存的分配時機是在編譯器編譯的時候進行內存的分配的
并且在C++中聲明為const的變量必須在聲明的時候進行初始化
下面寫一段例子進行證明:
所使用的C++工程如下所示:
#include <iostream>using namespace std;int main() {//證明const變量是在編譯的時候進行的內存的分配int a;const int b = 10;int c;printf("&a = %x,&b = %x,&c = %x\n",&a,&b,&c);system("pause"); return 0; }輸出的結果證明b的地址在a和c的之間,這就證明了const聲明的變量的內存是在編譯的時候進行內存的分配的;
在C++中const的用途,其實const常用來在C++中替換#define
在C++中能夠使用const聲明的變量作為數組得到下標,這是因為const聲明的變量也是在編譯階段進行的處理
const由編譯器處理提供類型檢查和作用域檢查
使用#define的時候就算是在局部函數中進行的宏定義作用域也是整個源文件下面的例子編譯是通過的
#include <iostream>using namespace std;int main02() {//證明const變量是在編譯的時候進行的內存的分配int a;const int b = 10;int c;printf("&a = %x,&b = %x,&c = %x\n",&a,&b,&c);system("pause"); return 0; }void func1() { #define a 10const int b = 20; //#undef a }void func2() {printf("a = %d\n",a); } int main() {func1() ;func2();system("pause"); return 0; }當打開#undef a 的時候編譯就不能夠通過,#undef就是取消對#define的宏定義可以指出定義得到內容也可以不指出 不指出的時候就是取消前面定義的任何的東西
#include <iostream>using namespace std;int main02() {//證明const變量是在編譯的時候進行的內存的分配int a;const int b = 10;int c;printf("&a = %x,&b = %x,&c = %x\n",&a,&b,&c);system("pause"); return 0; }void func1() { #define a 10const int b = 20; #undef a //這樣能保證只有在該函數中才能夠使用宏定義的a }void func2() {printf("a = %d\n",a); } int main() {func1() ;func2();system("pause"); return 0; }但是使用const在局部函數中聲明的變量 就不能夠在其他函數中進行調用
#include <iostream>using namespace std;int main02() {//證明const變量是在編譯的時候進行的內存的分配int a;const int b = 10;int c;printf("&a = %x,&b = %x,&c = %x\n",&a,&b,&c);system("pause"); return 0; }void func1() { #define a 10const int b = 20; //#undef a }void func2() {printf("a = %d\n",a);printf("b = %d",b); } int main() {func1() ;func2();system("pause"); return 0; } 1>------ 已啟動生成: 項目: 項目練習, 配置: Debug Win32 ------ 1>正在編譯... 1>demo8_const.cpp 1>e:\vs2008\項目練習\項目練習\demo8_const.cpp(28) : error C2065: “b”: 未聲明的標識符 1>生成日志保存在“file://e:\VS2008\項目練習\項目練習\Debug\BuildLog.htm” 1>項目練習 - 1 個錯誤,0 個警告 ========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========在C++中引用就相當于變量的別名,直接可以用來更改原始數據
#include <iostream>using namespace std; //復雜數據類型的引用struct Teacher {char name[64];int age; }; void printfT(Teacher &pT) {cout << pT.age << endl; } void printfT2(Teacher &pT) //引用相當于別名直接可惡意更改變量原來的數值 {pT.age = 26;cout << pT.age << endl; } int main() { Teacher t1;t1.age = 35;printfT(t1);printfT2(t1);system("pause"); return 0; } #include <iostream>//C語言中的宏定義 //使用宏定義對字符串進行處理using namespace std;int main() {int x = 20;const int &y = x; // 常引用 讓變量引用擁有只讀屬性 不能通過y修改x了{int &m = 20; //編譯不通過,因為 字面量沒有內存 // 引用就是給變量起一個別名,但是字面量沒有別名//const 變量的類型 C++編譯器會將const 類型數據分配內存const int &m = 10; //可以使用 因為C++會給m分配一個內存空間 讓 m 指向這個內存空間}system("pause"); return 0; }總結
- 上一篇: sizeof和gcvt转换双精度函数的函
- 下一篇: 【2017年第2期】税务大数据分析的技术