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);

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