More Effective C++ 笔记——条款1

条款1:仔细区别pointers和references


1、没有所谓的空引用

引用必须绑定某个对象,所以当我们设计的对象不能为null时,可以用引用来绑定这个对象。相反如果设计的对象可以为null时,应该使用指针去绑定这个对象,因为指针可以设为null。

这一规定意味着使用引用会比指针更高效,因为一般在使用指针之前通常需要去判断指针是否为空,而引用就不用考虑这些烦人的问题了。

void printData(const int &data)
{
    cout << data << endl;  // 不需要判空
}
void printData(const int *data)
{
    if (data != nullptr) {  // 需要检查是否为空指针
        cout << *data << endl;
    }
}

2、引用必须有初值

由于引用一定得代表一个对象,所以引用必须有初值,相反指针就没有这样的限制。

int &ref;  // 错,引用必须初始化。
int data = 0;
int &ref = data;  // 对,ref绑定data。
int *ptr;  // 指针可以不初始化,但建议不要这样写,因为此时ptr为任意值,它可能指向一段重要的代码,
           // 如果我们修改ptr指向的内存中的内容,会很危险,这也是野指针的一种。

3、永久绑定

指针和引用另一个重要的区别就是,指针可以重新赋值,可以指向另一个对象,而引用永远只能指向最初所绑定的那个对象。

string s1 = "hello";
string s2 = "world";

string &ref = s1;  // ref指向s1
string *ptr = s1;  // ptr指向s2

ref = s2;   // ref仍然指向s1,但此时s1的值变为了"world"
ptr = &s2;  // ptr现在指向了s2

4、使用某些操作符的情况

当我们实现某些操作符时,也需要使用引用,最常见的就是operator[]。

vector <int> v(10);  // int型vector

v[0] = 0;   // 赋值对象是operator[]的返回值,即引用。
*v[0] = 0;  // 如果返回的是一个指针,则赋值操作必须这样写。

总结:当我们知道需要指向某个东西,且绝对不会再去指向其他东西,或是实现的操作符,其语法需求用指针无法实现,我们就应该选用引用。而其他任何情况,需要用指针。

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

大聪明404

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值