Part1:C++引用类型

来源:互联网 发布:python 开发环境 编辑:程序博客网 时间:2024/05/29 19:34

       前言:大三马上要结束了,假期特意抽出点时间回顾一下C++,发现自己还是有很多似懂非懂的地方。于是就打算写几篇文章,既是对自己的激励,又希望与大家共勉!如果文章中有哪些不对的地方,请各位不吝赐教。谢谢大家支持!

       一、基本知识

      再多的文字有时也不如一两个例子来的生动,简洁。文中尽量避免空口白话,结合例子希望说明地清楚明白!

      *,&是学习C++的人经常碰到的,也是挺让人头疼的事情。(在这里必须郑重感谢MS的VS,纠错功能之强大使得许多人不很明白,却照样用引用和指针)。

     引用和指针是有一定的相同之处的,个人理解,两者都涉及地址这个概念,因此在参数传递时也就具有了节省空间的作用。试想一下,一个char ch[10000],传入一个头地址方便呢,还是将整个数组传入方便。

     从定义上看,引用类型和指针也是比较类似。

int x=0;//引用类型在声明引用变量时必须同时初始化int &x_cite = x;int *x_pointer = &x;
    上面定义了引用类型x_cite和指针x_pointer,并对它们进行了初始化。

    下面说一下指针类型和引用类型两者的区别。

int x;int y;int &x_cite = x;x_cite = y;int *x_pointer = &x;x_pointer = &y;
运行上面代码,VS编译器应该会报错

error C4700: 使用了未初始化的局部变量“y”
但是如果删掉"x_cite=y;"这一句,编译器就不会报错了。
int x;int y;int &x_cite = x;int *x_pointer = &x;x_pointer = &y;
这是因为引用类型只能指向一个变量。我可以理解为引用类型很专一,对一个人(变量)从一而终;而指针呢,则很花心,总是与不同的人(变量)交往。

    二、进阶第一步:函数中的引用类型

   新手在解除C++时,常常会被&和*搞混。希望看完下面的东西,可以对你有一点帮助!

   首先定义函数,   

//传入引用类型void find(int x){x = x + 1;}void find_cite(int &x){x = x + 1;}

   主函数

int x=0;int &x_cite=x;//声明引用变量时必须同时定义find(x);std::cout << "未使用引用类型" << std::endl;std::cout << x<<std::endl; //未改变xfind_cite(x_cite);std::cout << "使用引用类型" << std::endl;std::cout << x << std::endl; //改变x

  运行结果截图

 

  由上图可见,函数参数使用引用类型(int &x)改变了主函数中定义的整型“int x;”的值。究其原因,引用类型使用了变量x的地址,其操作是&x,即取x的地址,因此在改变x_cite的同时对原来的x也有影响。

  进一步说,这里如果使用

find_cite(x);

  其结果也是相同的!
  定义返回引用类型的函数,如下:

int& find_cite(int &x){x = x + 1;        return x;}
  不过这样做的意义通常不大。

   三、进阶第二步:类对象的引用

class Node{public:int data = 5;};void fun1(Node nd){nd.data = 10;}void fun2(Node &nd){nd.data = 20;}void fun3(Node* nd){nd->data = 30;}void main(){        Node nd;int num = nd.data;cout << num<< endl;fun1(nd);cout << num << endl;fun2(nd);num = nd.data;cout << num << endl;fun3(&nd);num = nd.data;cout << num << endl;}
    运行结果截图:

    

    如果定义int &num=nd.data;,就不需要num=nd.data;这一步了!同样可以得到上面的结果。

void main(){               Node nd;int &num = nd.data;cout << num<< endl;fun1(nd);cout << num << endl;fun2(nd);//num = nd.data;cout << num << endl;fun3(&nd);//num = nd.data;cout << num << endl;}

   未完待续!



0 0
原创粉丝点击