引用和指针

来源:互联网 发布:基础软件 编辑:程序博客网 时间:2024/06/04 01:00
 

每次看到这些区别的时候都是特别的头疼,因为在很多面试题中看到过,但是每次答这个题的都是记不清他们的区别。为什么老是记不住呢?因为以前我一直都不明白为什么要有引用这样的数据类型。而且在编程中好像我从来都不曾定义过引用类型的数据,倒是指针类型的很常用。
以前在看到引用的时候,看到它是这么被定义的:int &a;看到&这个符号,这多多少少的会把它和取地址符联系在一起。那么他们是否有什么联系呢?我在VC中写下这么一段代码:

int main(int argc, char* argv[])
{
char str[]="woaini";

char *s=str;
s="liunian";
cout<<str<<endl;

char &n=*str;
n='a';
cout<<str<<endl;

return 0;
}

而且我在对&n赋值的时候,本来我是想也赋值个字符串,但是我没有办法能够做到。因为c++规定,没有引用类型的数组,所以我只能给她个字符a。
我希望你们可以注意到输出文本的不同。改变引用的值其实就改变了赋它值变量的值。本来这些书上都是有说明的。我写这篇文章并不是要重复书上的话,关键是想说明引用在编程中有什么用,为什么在C语言中不需要引用,而到了c++中却提出引用类型。

我注意到引用的作用是在写一个string类的时候,要实现一个这样的功能:string a=b;这就要去重载=号了。我开始在VC中这么写道:
string * string::operator =(const string *cstr)
因为从来没有用过引用,使得我开始就习惯性的定义了一个string类型的指针。但是在我使用string类的时候,我就立即发现了问题:我不能如愿的想这么写string a=b;因为a,b都不是指针,他们都是对象。那应该怎么改呢?这就让我想起了引用。于是这么写:
string & string::operator =(const string &cstr);
需要引用的时候才会想起回头去认真体会引用这个知识点,用到的时候才会对它有更深刻的体会。
于是我就想,我真的以前在编程中没有使用到引用吗?我又想到了CString类,它的一个函数

看到GetWindowText参数CString &rString的声明可以看到是一个引用类型。以前总是习惯性的照着书上传递一个CString类的一个对象,却不知为什么可以这么传。
上面说到C++中却要引入引用,窃以为是为类的对象准备的。不知道对不对

 

 

 


而对于引用的其他规定用法请参见书上。

这里我先给出别人总结的引用和指针的区别:


一、比较一

引用是C++中的概念,初学者容易把引用和指针混淆一起
一下程序中,n是m的一个引用(reference),m是被引用物(referent)。
int m;
int &n = m;
n相当于m的别名(绰号),对n的任何操作就是对m的操作。
所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。

引用的规则:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

二、比较二

(1)非空区别。在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让他指向一个对象,但是该变量在某些时候也可能不指向任何对象,这是你应该把变量声明为指针,因为这样你可以赋予空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值得引用这个事实意味着使用引用的代码效率比使用指针要高。

(2)合法性区别。在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。

(3)可修改区别。指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则是总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。

(4)应用区别。总的来说,在以下情况下你应该使用指针:一是你考虑到存在不指向任何对象对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。

原创粉丝点击