C++知識點總結(bool、三目運算符、const、引用)

1、bool類型
bool有兩個內建的常量,true和false
三個名字都是關鍵字。
bool類型只有兩個值,一個true(1),一個false(0)。
給bool類型賦值時,只能賦true,false和數值(非0自動轉換爲1,負數也轉爲1)。

int main (int argc,char *argv[])
{

    bool myBool = -123;
    bool myBool1 = false;
    bool myBool2 = true;
    cout << "myBool=" << myBool <<endl;
    cout << "myBool1=" << myBool1 <<endl;
    cout << "myBool2=" << myBool2 <<endl;
    cout << "false=" << false <<endl;
    cout << "true=" << true << endl;
    return 0;
}

運行結果:
在這裏插入圖片描述
2、三目運算符
a、C語言中三目運算表達式返回值爲數據值,爲右值,不能賦值
b、c++中三目運算表達式返回值爲變量本身,爲左值。可賦值

3、const修飾變量
a、C語言中
1、const修飾全局變量num 變量名只讀 內存空間在文字常量區(只讀)、不能通過num的地址 修改空間內容
2、const修飾局部變量data 變量名只讀 內存空間棧區(可讀可寫),可以通過data地址 間接的修改空間內容
b、c++語言中的中const
1、const int data = 10;//data先放入符號表
2、如果對data取地址 系統纔會給data開闢空間
3、const int a = b;//b是變量名 系統直接給a開闢空間 而不放入符號表
4、cosnt 修飾自定義數據 系統爲自定義數據開闢空間

c、const和#define(宏)
1、const有類型的,可進行編譯器類型安全檢查。#define無類型。
宏不佔內存空間,但是宏展開以後的數據是要佔內存的。

#define MAX 10
cout << "宏 " << sizeof(MAX) << endl;//求得是 10 的大小

2、const有作用域,#define不重視作用域,默認定義處到文件結尾。
3、宏不能作爲命名空間的成員,但const可以。

#include <iostream>
using namespace std;

namespace A {
    #define M 10
}

int main (int argc,char *argv[])
{

     cout << A::M << endl;//err:宏是大家的,不是A自己的,將A::去掉就可以了
    return 0;
}

4、引用:給已有變量取個別名
1、語法:
1、&和別名 結合 表示引用
2、給某個變量取別名 就定義某個變量
3、從上往下替換

int num = 10;

int &a = num;//此處 &不是取地址 而是標明 a是引用變量(a 是 num的別名)

注意:
a、引用必須初始化。(娃娃親)
b、引用一旦初始化,就不能再次修改別名。(一生一世)
案例(幫助消化):

int num = 10;

int &a = num;//a就是num的別名  a==num


cout<<"num = "<<num<<endl;//10

//對a賦值 == 對num賦值

a=100;

cout<<"num = "<<num<<endl;//100


//a是num的別名 所以num和a具有相同的地址空間

cout<<"a 的地址:"<<&a<<endl;

cout<<"num 的地址:"<<&num<<endl;

結果:
在這裏插入圖片描述2、引用給數組取別名
方法1:

int main (int argc,char *argv[])
{

     int arr[4]={1,2,3,5};
     int (&a)[4]=arr;//整體代換
     int i = 0;
     for (i=0;i<4;i++)
     {
         cout << a[i] <<" ";
         cout << arr[i] <<" ";
     }
         return 0;
}

方法2:配合typedef

int main (int argc,char *argv[])
{

     int arr[4]={1,2,3,5};
     typedef int TYPE_ARR[4];//用typedef給數組取個別名
     TYPE_ARR &myArr = arr;//數組的別名
     int i = 0;
     for (i=0;i<4;i++)
     {
         cout << myArr[i] <<" ";
         cout << arr[i] <<" ";
     }
         return 0;
}

3、引用作爲函數的參數(作用跟指針相似)

void my_swap1(int a,int b)

{

    int tmp = a;

    a = b;

    b=tmp;

}

void my_swap2(int *a,int *b)//a=&data1,b =data2;

{

    int tmp = *a;

    *a = *b;

    *b = tmp;

}


void my_swap3(int &a, int &b)//a=data1,b=data2

{

    int tmp = a;

    a = b;

    b= tmp;

}

void test04()

{

    int data1 = 10,data2=20;

    cout<<"data1 = "<<data1<<", data2 = "<<data2<<endl;

    //my_swap1(data1,data2);//交換失敗

    //my_swap2(&data1,&data2);//交換成功

    my_swap3(data1,data2);//交換成功(推薦)

    cout<<"data1 = "<<data1<<", data2 = "<<data2<<endl;

}

4、引用作爲函數的返回值
函數返回啥變量,引用就是該變量的別名
注意:不要返回局部變量哦,可以來個靜態局部變量
5、 引用的本質:
引用的本質在c++內部實現是一個指針常量. Type& ref = val; // Type* const ref = &val;
c++編譯器在編譯過程中使用常指針作爲引用的內部實現,因此引用所佔用的空間大小與指針相同,只是這個過程是編譯器內部實現,用戶不可見
6、常引用

typedef struct
{

    int num;

    char name[32];

}STU;

void myPrintSTU1(STU tmp)//普通結構體變量作爲形參 開銷太大

{

    cout<<sizeof(tmp)<<endl;

    cout<<"學號:"<<tmp.num<<", 姓名:"<<tmp.name<<endl;

}

void myPrintSTU2(const STU &tmp)//STU &tmp=lucy;tmp是lucy的別名 tmp沒有開闢獨立空間

{

    //tmp.num = 2000;//err 因爲tmp爲常引用

    cout<<"學號:"<<tmp.num<<", 姓名:"<<tmp.name<<endl;

}

void test08()

{

    STU lucy = {100,"lucy"};


    //需求:定義一個函數 遍歷lucy成員(讀操作)

    myPrintSTU2(lucy);

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章