仔细区别 pointers 和 references

仔细区别 pointers 和 references

参考《More Effective C++》

没有所谓的 null references

一个引用必须总代表某个对象。所以如果有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能他不指向(代表)任何对象,那么你应该使用 pointers,因为你可以将 pointers 设为 null。换句话说,如果一个变量总是代表一个对象,也就是不能使这个变量为 null,那么你应该使用 references

以下是某种未定义行为:

char* p = nullptr;
char& rp = *p;

这是一种未定义行为,编译器可能会产生任何可能的输出。

《More Effective C++》的作者说,写出这种代码的人,应该与世隔绝。

references 必须初始化

在定义引用变量的时候,一定要初始化,不然编译器会报错。而指针可以不进行初始化。

正因为如此,有的时候 references 会比 pointers 的效率高。

举个?

void PrintSliegman(const int& Sliegman)
{
    std::cout << Sliegman << std::endl;
}

void PrintSliegman(const int* Sliegman)
{
    if (nullptr != Sliegman)
    {
	    std::cout << *Sliegman << std::endl;
    }
}

如果使用 pointers 还要进行一步判断操作,因为 pointers 有可能指向 null,而使用引用就可以直接打印,因为它一定指向某个 int 类型的数据。

pointers 可以被重新赋值

因为 references 总是代表某一个对象,所以它不可以重新赋值,但是 pointers 可以。

一般来说,当你考虑到你有可能不指向任何对象的时候或者在不同时刻指向不同的对象的时候,要使用 pointers。而当你确定“总是指向某一个对象”,而且“一旦代表了该对象就不能够再改变”,那么你应该使用 references

某些特殊情况

例如 operator[] 的时候要返回引用而不是指针,这种操作符很特别的必须返回某种“能够被当做 assignment 赋值对象”的东西:

std::vector<int> a;

当你想访问某个值的时候,你会进行 [] 操作。

a[1] = 999;

可是如果你返回指针的话,就会变成这样:

*a[1] = 999;

这看起来就很别扭,所以这种情况下就需要返回一个 references

常规区别

  • 指针++ 是指针向后偏移一个类型的字节,而 引用++ 就是代表的值++
  • sizeof(指针) 是指针的大小,32位平台下指针占4个字节,64位平台下指针占8个字节。而sizeof(引用) 表示引用代表的值得大小。
  • 有多级指针,没有多级引用
  • 访问实体的时候,指针需要显示解引用,引用编译器自己处理。
  • 引用比指针相对安全

叮~?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值