第七天2017/04/14(引用与const、C++基本知识)
生活随笔
收集整理的這篇文章主要介紹了
第七天2017/04/14(引用与const、C++基本知识)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、引用與const
1、const引用的初始化的兩種形式: //const引用,讓被const修飾的變量具有只讀屬性 #include <iostream> using namespace std; int main() { //給常引用初始化,有兩種方法://1.讓變量初始化const引用int a = 10;const int &b = a;//b = 100; //不能通過b去修改a,編譯錯誤a = 100; //正確,但是可以修改a本身,此時a和b都變成修改后的100printf("%d,%d",a,b);//2.使用字面常量初始化const引用//int &c = 10; //失敗,因為10是字面量,字面量10沒有分配內存空間const int &d = 10; //成功,加上const,C++編譯器會給10分配內存空間 } ============================================================ 2、接著就是難點:分析下面三個輸出結果,哪個輸出是亂碼? #include <iostream> using namespace std; //問:打印出來的b1、b2、b3哪個是亂碼?為什么? int f1() {int a;a = 11;return a; } int& f2() //返回一個局部變量a的引用 {int a;a = 11;return a; } int main() {//用引用的本質去剖析它:引用的本質是const type *name,C++編譯器會對引用執行*name操作int b1 = f1(); //OK //重點分析下面兩句話:int b2 = f2(); //返回一個值,賦值給b2int& b3 = f2(); printf("b1 = %d\n",b1); // 11printf("b2 = %d\n",b2); // 11printf("b3 = %d\n",b3); // 亂碼 } 【解析】 int b2 = f2();//在f2()中給a分配內存,在main中給b2也分配內存,在f2()沒有執行完時,//用b2把f2()返回的值接過來,相當于分配了兩個內存(a一個,b2一個),因此//b2打印出來的不是亂碼 int& b3 = f2(); //b3是一個引用類型,C++編譯器會幫我們執行*b3操作,又//由于a在f2()調用后內存地址被回收,此時*b3打印出來是一個亂碼。 【先背下來】返回指針的引用int& f(); 當用int b2 = f();接受時,正確; 當用int& b3 = f();接受時,錯誤。3、“結構體指針的引用作形參、結構體二級指針” 的對比 #include <iostream> using namespace std;struct student {int age;char name[10]; };void getStudent1(struct student* *stu) {struct student* pTmp = NULL;pTmp = (struct student*)malloc(sizeof(struct student)); //創建一個結構體指針,并分配內存pTmp->age = 24;strcpy(pTmp->name,"Mr.g");*stu = pTmp; } void getStudent2(struct student* &pTmp) //重點講解結構體指針的引用 {pTmp = (struct student*)malloc(sizeof(struct student));pTmp->age = 22;strcpy(pTmp->name,"Mr.w"); }int main() { struct student* p1 = NULL;struct student* p2 = NULL; //用二級指針(作形參)處理一級指針(作實參)getStudent1(&p1); //用一級指針的引用(作形參)處理一級指針(作實參)getStudent2(p2);cout<<p1->age<<" "<<p1->name<<endl;cout<<p2->age<<" "<<p2->name<<endl; }================================================================= 4、const結構體引用 注://const int& a; 等價于const int* const a; void getStudent3(const struct student &pTmp)//const引用修飾的變量pTmp { //1.pTmp本身不能被修改//struct student stu; //pTmp = stu; //2.pTmp變量的元素不能被改變//pTmp->age = 22; //strcpy(pTmp->name,"Mr.w"); } ================================================================= 5、 //const變量 可以替代#define宏常數 //inline函數可以替代#define表達式 #include <iostream> using namespace std;#define a1 10 #define func1(a,b) ((a)<(b)?(a):(b)) //const變量 可以替代#define宏常數 //inline函數可以替代#define表達式 const int a2 = 10; inline int func2(int a,int b) //注:內聯函數的函數體必須和函數實現寫在一起 {//內聯函數沒有普通函數調用時的內存開銷(壓棧、跳轉、返回)return a<b?a:b; } int main() {int a =1,b = 3;printf("%d\n",func1(++a,b)); //宏定義:結果不是2,竟然是3,會發生令人“蛋疼的問題”,產生副作用!//printf("%d\n",func2(++a,b)); //內聯函數:2 } 【解釋】func1(++a,b) ==> ((++a)<(b)?(++a):(b))二、C++基本知識
1、函數默認參數的規則聲明:void f(int a,int b,int c = 100);調用:f(1,2);f(1,2,3); 2、函數占位參數:占位參數只有參數類型聲明,沒有參數名聲明 聲明int f(int a,int b,int ,float){return a+b;} 調用://int result1 = f(1,2); //編譯失敗 int result2 = f(1,2,3,4); 3、函數默認參數和占位參數混搭 聲明int f(int a,int b,int = 0 ,float = 0.0){return a+b;} 調用://int result1 = f(1,2); //編譯成功int result2 = f(1,2,3,4); 4、函數重載:并不是C++的特性,函數的重寫才是5、函數重載和函數指針總結
以上是生活随笔為你收集整理的第七天2017/04/14(引用与const、C++基本知识)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第七天2017/04/14(C++对C的
- 下一篇: 第八天2017/04/17(1、拷贝构造