嘀嘀咕 (1)

1.三目运算符(可以当左值)

c中:
int a = 10;
int b = 20;
(a<b?a:b) = 30;    //err

*(a<b?&a:&b) = 30;

2.const增强

c:伪常量

const int a = 10;

int array[a] = {0};    //err

int *p = &a;
*p = 20;    //a = 20

c++:

const int a = 10;    

int array[a] = {0};    //ok

int *p = (int *)&a;
*p = 20;    //a = 10

c++中的const并不为其分配空间,而是在符号表中。
如果对一个常量取地址,编译器会临时开辟一个空间temp。让这个指针存放这个临时空间的地址

与宏定义区别:

const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换

3.引用

引用是个常指针;有内存空间(常量区上,反正不在栈上)

使用时当作变量的别名

struct typeA
{
    int *a;
}

struct typeB
{
    int &a;
}

sizeof(typedA) == sizeof(typdeB)  == 4

int &a    <===>   int *const a;

引用作为返回值,不要返回局部变量的引用

int& getA( )
{
    int a = 10;
    return a;
}

int &A = getA( );    
cout<<A<<endl;    //乱码    A是局部变量a的别名

//引用作为返回值,可以作为左值
int& getB( )
{
    static int a  =10;
    return a;
}

getB( ) = 100;

指针引用 用做函数参数

struct  Teacher
{
    char  name[64];
    int  age  ;
};

int  getTeacher(Teacher  **p)
{
    Teacher  *tmp  =  NULL;
    if  (p  ==  NULL)
    {
        return  ‐1;
    }
    tmp  =  (Teacher  *)malloc(sizeof(Teacher));
    if  (tmp  ==  NULL)
    {
        return  ‐2;
    }
    tmp‐>age  =  33;
 
    *p  =  tmp;
    return  0;
}


int  getTeacher2(Teacher*  &myp)
{
    //给myp赋值  相当于给main函数中的pT1赋值
    myp  =  (Teacher  *)malloc(sizeof(Teacher));
    if  (myp  ==  NULL)
    {
        return  ‐1;
    }
    myp‐>age  =  36;
    return  0;
}

void  FreeTeacher(Teacher  *pT1)
{
    if  (pT1  ==  NULL)
    {
        return  ;
    }
    free(pT1);
}

int  main(void)
{
    Teacher  *pT1  =  NULL;
    //1  c语⾔言中的二级指针
    getTeacher(&pT1);
    cout<<"age:"<<pT1‐>age<<endl;
    FreeTeacher(pT1);

    //2  c++中的引⽤用  (指针的引⽤用)
    //引⽤用的本质  间接赋值后2个条件  让c++编译器帮我们程序员做了。
    getTeacher2(pT1);
    cout<<"age:"<<pT1‐>age<<endl;
    FreeTeacher(pT1);
    return  0;
}

常引用(目的:禁止通过修改引用值来改变被引用的对象)

const int & e   =====  const int * const e

常量(字面量)对const引用进行初始化时,C++编译器会为常量值
分配空间,并将引用名作为这段空间的别名
const  int  &m  =  43;                      //c++编译器  会  分配内存空间
                                            //  int  temp  =  43
                                            //  const  int  &m  =  temp;
posted @ 2018-10-17 20:42  神秘的火柴人  阅读(296)  评论(0编辑  收藏  举报