引用

今天在《剑指offer》用deque时,看到  

std::deque<BinaryTreeNode*> dequeTreeNode;

BinaryTreeNode *pNode = dequeTreeNode.front();

front()  是返回双向队列的第一个元素的引用

可以把一个引用赋值给一个指针吗????我产生了困惑(实际上这是十分弱智的想法)

分析:

引用的本质就是一个  指针常量  Type *const p;   所谓的指针常量:即保保证指针指向的位置是不变的,而指向位置的内容是可以改变的。

int a = 1; 

int * const p = &a;

p++;  //error

*p = 10; //ok

 

 

所以,对引用的理解需要加深.

 

1、 引用是C++的概念,属于C++编译器对C的扩展

2、引用的本质

1)引用在C++中的内部实现是一个指针常量

Type& name çèType* const name

2C++编译器在编译过程中使用指针常量作为引用的内部实现,因此引用所占用的空间大小与指针相同。

3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏

 

引用在实现上,只不过是把:

间接赋值成立的三个条件的后两步和二为一。

//当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)

引用当左值

//基础类型a返回的时候,也会有一个副本

 

int b;   //全局变量

 

int getAA1()

{

int a;

a = 10;

return a;

}

 

 

int& getAA2()

{

int a;

a = 10;

return a;

}

int& getAA3()

{

b = 10;

return b;

}

 

 

 

void main21()

{

int a1 = 0;

int a2 = 0;

 

a1 = getAA1();

a2 = getAA2();//可以。。而且 系统不生成返回值的副本

 

int &a3 = getAA2(); //乱码。若返回栈变量不能成为 其它引用 的初始值

    Int &a4 = getAA2();// 可以 。。。全局变量

 

 

 

printf("a1:%d \n", a1);

printf("a2:%d \n", a2);

printf("a3:%d \n", a3);

 

 

system("pause");

}

当函数返回值为引用时

用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。这也就导致了返回栈变量时的问题

 

若返回栈变量

不能成为 其它引用 的初始值

 不能作为左值使用

 

若返回静态变量或全局变量

可以成为其他引用的初始值

即可作为右值使用,也可作为左值使用

C++链式编程中,经常用到引用,运算符重载专题

 

指针引用

//指针的引用而已

int getTe2(Teacher*  &myp)

{

myp = (Teacher *)malloc(sizeof(Teacher));

myp->age = 34;

 

return 0;

}

1   const引用让变量拥有只读属性

void printTe2(const Teacher1 *const pt)

{

 

}

 

//const引用让变量(所指内存空间)拥有只读属性

void printTe(const Teacher1 &t)

{

//t.age  = 11;

}

2   Const引用 用字面量初始化const引用

void main()

{

const int b = 10;

printf("b:%d", &b);

 

//int &a1 = 19; 如果不加const编译失败

const int &a = 19;

printf("&a:%d \n", &a);

 

system("pause");

}

 

 

demo.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = 0;
    int aa = 1;
    int &b = a;  //声明a的引用并初始化 从此操作b就和操作a一样
    printf("pa:%p,pb:%p\n", &a, &b);//  输出 :a和b的地址是一样的  说明a就是b
    int *p = &b;  //指针p指向a的引用
    (*p)++;
    printf("*p:%d,a:%d,b:%d\n", *p,a,b);  //输出全是1

    //int &a1 = 19;//   Error;提示非常量引用的初始值必须为左值
    const int &a1 = 19; //  OK 

    system("pause");
    return 0;
}

 

posted @ 2017-03-15 16:21  ren_zhg1992  阅读(148)  评论(0)    收藏  举报