首页 > 其他 > 详细

引用专题

时间:2017-01-18 23:30:40      阅读:245      评论:0      收藏:0      [点我收藏+]

引用的知识大概分四块:引用基础、引用当左值、指针的引用、const(常量)的引用


1、引用(普通引用)

 ⑴引用概念

  技术分享

 ⑵引用是C++的概念

 技术分享

 ⑶引用做函数参数

   普通引用在声明时必须用其他的变量进行初始化

  

   引用作为函数参数时不进行初始化

   

   ①复杂数据类型 的引用

   

    #include <iostream>
    using namespace std;
    struct Teacher
    {
        char name[64];
        int age;
    }
    
    void printfT(Teacher *pT)
    {
       cout << pT->age << endl;  //指针应用
       
    }
    
    void printfT2(Teacher &pT)
    {
       cout << pT.age << endl;  // 引用
       pT.age = 33;   //pT是t1的别名,相当于修改了t1;
    }
    
    void printfT3(Teacher pT)
    {
       cout << pT.age << endl;// pT是形参
       pT.age = 45;   //只会修改pT变量,不会修改t1变量
    }
    
    void main()
    {
        Teacher t1;
        t1.age = 35;
        printfT(&t1);
        printfT2(t1);   //pT是t1的别名
        printfT3(t1);   //pT是形参,t1 拷贝一份数据给pT
        
        printf("t1.age:%d \n",t1.age); //输出依然为35
        
        cout << "hello..." << endl;
    }



 ⑷引用的意义

  技术分享

 ⑸引用的本质思考

   两点来思考:1、C++编译器背后做了什么工作?

           2、普通引用有自己的空间吗?答案是 有的



   引用的本质:引用是一个有地址,引用是常量。。。

      char* const p; 

 ⑹引用的本质

  技术分享

 ⑺引用结论

  技术分享

  

 ⑻函数返回值是引用(引用当左值)  


  C++引用使用时的难点:

      当函数返回值为引用时,

        1、   若返回栈变量

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

             不能作为左值使用

#include <iostream>

int getAA1()
{
    int a;
    a = 10;
    return a;
}

//返回a的本身;要看用什么类型来 接收返回的值
int& getAA2()
{
    int a; //
    a = 10;
    return a;
}

int* getAA3()
{
    int a;
    a = 10;
    return &a;
}
void main()
{
    int a1 = getAA1; //输出a1 = 10
    
    int a2 = getAA2();// 输出a2 = 
    
    int &a3 = getAA2();//是错误的;若返回栈变量 不能成为其他引用的初始值


    cout << "hello.." << endl;
}

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

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

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

  

int j1()
{
    static int a = 10;
    a++;
    return a;
}

int& j2()
{
    static int a = 10;
    a++;
    return a;
}
void main()
{
    int a1 = 10;
    int a2 = 20;
    
    a1 = j1();
    a2 = j2();
    int &a3 = j2();
    printf("a1:%d\n",a1);
    printf("a2:%d\n",a2);
    printf("a3:%d\n",a3);
}


//函数当左值

//返回变量的值
int g1()
{
   static int a = 10;
    a++;
    return a;
}

//返回变量本身
int& g2()
{
   static int a = 10;
    a++;
    return a;                //即返回变量a
}

void main()
{
    g1() = 100;//相当于  10 = 100;是错误的
    
    g2() = 100;//相当于  a = 100;改变了a的值 ;原因:函数返回值是一个引用,可以当左值
    g2();   //打印a的值,应该是101
    
}


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


 ⑼指针引用

  

 C语言二级指针原理 

#include <iostream>
using namespace std;

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

//在被调用函数 获取资源
int getTeacher(Teacher **p)
{
    Teacher **tmp = NULL;
    tmp = (Teacher *)malloc(sizeof(Teacher));
    if(tmp == NULL)
    {
        return -2
    }
    p->age = 33; //p是实参的地址 *实参的地址 去间接的修改实参的值
    
    *p = tmp;
}
//C++中的引用 (指针引用)
int getTeacher2(Teacher * &myp)
{
   //给myp赋值相当于给main函数中的pT1赋值
    myp = (Teacher *)malloc(sizeof(Teacher));
    if(myp == NULL)
    {
       return -1;
    }
    myp->age = 36;
}

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


void main()
{
    Teacher *pT1 = NULL;
    1、//C语言中的二级指针
    getTeacher(&pT1);
    cout << "age" << pT1->age << endl;
    freeTeacher(pT1);
    
    
    2、//C++中的引用(指针的引用)
    
    //引用的本质  间接赋值的后两个条件 让C++编译器帮程序员做了
    getTeacher2(pT1);
    cout << "age" << pT1->age << endl;
    freeTeacher(pT1);
    cout << "hello..." << endl;
}


本文出自 “11907685” 博客,请务必保留此出处http://11917685.blog.51cto.com/11907685/1893022

引用专题

原文:http://11917685.blog.51cto.com/11907685/1893022

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!