引用

引用是c++的语法,所以c编译器是不能识别引用的。

int a = 40;
int &b = a;

引用的实质:

引用是一个只读的常量,引用在C++中的内部实现是一个常指针。

引用的意义:

作为变量的别名而存在,因此在一些场合可以代替指针

c++编译器中,普通引用会分配空间吗?

struct Teacer {
    int &a;
    int &b;
};

sizeof(sttuct Teacer) = 8;

由于引用的实质是常指针,所以它需要占用内存,那么怎么解释下吗的语法?

Teacer a;
Teacer &b = a;
b.num = 10;  //实际上编译器处理为(*b).num = 10;

void fun(Teacer& k)
{
    ...;
}

void main()
{
    Teacer t; 
    fun(t);     
   /*此处,相当于 const Teacer* k=&t;只不过这是编译器帮你完成的*/
}

引用当左值:

int& fun()
{
     int a = 20;
     return a;
}


void main()
{
     int a1 = fun();
     int &a2 = fun();
     
     printf("%d,%d\n",a1,a2);
}

函数返回类型为引用,在执行return语句,编译器自动在return的变量前加取值符号,即 return &a;在调用函数处编译器将创建一个临时副本空间——*p。const int *p = &a

int a1 =fun()  ==> int a1 = *p =*(&a);所以这里的a1空间的值为20。

int &a2 = *p = *(&a); 但是这里需要注意,a2是一个指针,它指向的空间被赋值为了20,这点是成立的,不过在执行完这句函数调用之后(分号结束一个语句)临时空间被释放了,那么a2指向的空间也被释放了,所以a2(实际上是*a2)就是一个垃圾值了。

 

为了验证返回类型为引用的函数,会在生成的临时空间上加*号 

int fun_1()
{
     int a = 20;
     return a;
}

int& fun_2()
{
     static int a = 20;
     return a;
}


void main()
{
     fun_1() = 100; //编译不成立,函数返回一个值
     
     fun_2() = 40;  //编译成立,*(&a)=40;函数返回变量——*(&a)
}

函数作为左值,那么函数返回值类型必须是引用。

 

指针的引用:

int fun(teacher* &myp)
{
     myp =(teacher*)malloc(sizeof(teacher));
     myp->age = 34;
     return 0;
}



void main()
{
    teacher* p =NULL;
    fun(p);

    printf("age::%d \n",p->age);

}

这里的teacher* &myp就是指针引用的定义,调用函数时,就相当于 teacher* &myp = p;在理解上就是相当于为p取别名myp一样。实际上使用引用时,编译器会为我们自动添加*,所以实际函数如下情况:

int fun(teacher** myp)
{
     *myp =(teacher*)malloc(sizeof(teacher));
     *myp->age = 34;
     return 0;
}

 

常引用:

int b = 10;
const int &a = b;  //表示说,不能再用a去修改b变量的值了
int &c = 10;  //编译不通过
const int &d = 10;  //编译通过

 

posted @ 2016-10-17 13:54  e-data  阅读(127)  评论(0)    收藏  举报