简单谈谈C++中指针与引用的区别

所属分类: 软件编程 / C 语言 阅读数: 44
收藏 0 赞 0 分享

指针与引用是C++中两个很重要的概念,它们功能看过去很相似,就是都是间接引用某个对象,那么我们应该在什么时候使用指针,什么时候使用引用呢,下面请允许我慢慢道来:

1.永远不要使用一个指向空值的引用。一个引用必须始终指向某个对象,所以当你确定使用一个变量指向某个对象时,但是这个对象在某些时间可能指向控制,这时候你就必须把变量声明为指针类型,而不是引用!当你确定这个变量始终指向某个对象是,这时候你就可以把变量声明为引用类型。

char *str=0; //设置指针为空值
char &s=*str; //让引用指向空值

你应该避免出现上面的错误!

2.因为引用肯定要指向一个对象,所以,在C语言里引用必须被初始化。

string& rs;   // 错误引用必须被初始化
string s("xyzzy");
string& rs = s; // 正确 rs指向s

指针没有这样的限制:

string *ps; // 未 初 始 化 的 指 针
      // 合 法 但 危 险

3.不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高,因为在使用引用之前不需要测试它的合法性。

void printDouble(const double& rd)
{
   cout << rd;  // 不需要测试rd,它
}          // 肯定指向一个double值

相反指针则应该总是被测试防止其为空:

void printDouble(const double *pd)
  {
    if (pd) {  // 检查是否为NULL
      cout << *pd;
    }
  }

4.指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向在初始化时被指定的对象以后不能改变。

string s1("Nancy");
  string s2("Clancy");
  string& rs = s1; // rs 引用s1
  string *ps = &s1; // ps 指向s1
  rs = s2; // rs 仍旧引用s1,
      // 但是s1的值现在是
      // "Clancy"
  ps = &s2; // ps 现在指向s2;
       // s1 没有改变

5.重载某个操作符时你应该使用引用。最普通的例子是重载操作符[]。这个操作符典型的用法是返回一个目标对象其能被赋值。

总的来说在以下情况下你应该使用指针:

一是你考虑到存在不指向任何对象的可能,在这种情况下你能够设置指针为空;

二是你需要能够在不同的时刻指向不同的对象,在这种情况下你能改变指针的指向。

如果总是指向一个对象,并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。

更多精彩内容其他人还在看

C++广播通信实例

这篇文章主要介绍了C++实现广播通信的方法,实例讲述了C++ socket广播通信的原理与实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C++计算ICMP头的校验和实例

这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++设置超时时间的简单实现方法

这篇文章主要介绍了C++设置超时时间的简单实现方法,涉及系统函数setsockopt对套接口的操作,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现ping程序实例

这篇文章主要介绍了C++实现ping程序实例,涉及C++对于ICMP数据包的发送与回显处理,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之boost::array的用法

这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之Boost::array用法简介

这篇文章主要介绍了C++之Boost::array用法简介,较为详细的分析了Boost::array中的常见用法,并用实例的形式予以总结归纳,需要的朋友可以参考下
收藏 0 赞 0 分享

VC文件目录常见操作实例汇总

这篇文章主要介绍了VC文件目录常见操作实例汇总,总结了VC针对文件目录的各种常用操作,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

VC打印word,excel文本文件的方法

这篇文章主要介绍了VC打印word,excel文本文件的方法,是VC操作文本文件中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC++获得当前进程运行目录的方法

这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC中SendMessage和PostMessage的区别

这篇文章主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多