引用指向的对象

时间:2010-01-20 03:15:00

标签: c++ reference pointers

取消引用指针会使代码难以阅读。我通常做的是对尖头对象进行引用并使用引用。例如:

shared_ptr<std::vector<int> > sp = get_sp_to_vector();
std::vector<int>& vec = *sp;
...
vec.push_back(5);

我想知道这是不是一个好习惯。它有任何缺点吗?

更新:要完成此示例,我将按以下方式定义get_sp_to_vector()

shared_ptr<std::vector<int> >  get_sp_to_vector()
{
    // create a vector and send back a shared pointer pointing at it
    shared_ptr<std::vector<int> >  sp(new std::vector<int>);
    sp->push_back(1);  sp->push_back(3);
    return sp;
}

5 个答案:

答案 0 :(得分:2)

我不认为这是一个好习惯。指针是C / C ++开发的主要内容,而b / c,C / C ++编码器对指针所需的去引用语法很满意。我尽量避免使用指针(尽管不是出于语法原因),但有时它只是工作的最佳工具。如果你的代码是粗略的b / c你正在使用指针,我通常会将它取消引用到一个函数中,该函数通过引用传递对象,这实际上就是你正在做的事情,但在我看来它是这样做的更优雅的方式。所以而不是:

shared_ptr<std::vector<int> > sp = get_sp_to_vector();
std::vector<int>& vec = *sp;
...ugly stuff...
vec.push_back(5);

我愿意:

void func(std::vector<int> &vec)
{
     ... previously ugly stuff...
     vec.push_back(5);
}

shared_ptr<std::vector<int> > sp = get_sp_to_vector();
func(*sp);

编辑:
这并不是说你应该创建一个函数来简单地为指针创建更好的语法,因为它表明如果你不喜欢指针语法并且你的代码使用干净简洁的函数,你可以简单地使函数采取在调用函数时引用和取消引用指针。对于只有几次调用* p或p-> x的情况,使用引用创建函数或创建引用以调用p.x似乎很愚蠢。在这些情况下只使用指针语法,因为这是C / C ++语法。

其他人已经提出在循环中使用引用,其中指针可能必须被多次取消引用。我同意在这些情况下参考将是有益的。

答案 1 :(得分:2)

使用本地引用很常见,特别是在循环体内部,但有一个要求:只有当引用显然与目标对象一样长时才能使用它。

这通常不难保证,但这里有一些不好的例子:

shared_ptr<X> p = get_p();
X& r = *p;
p.reset(); // might result in destroying r
use(r); // oops

// or:
shared_ptr<X> p = get_p();
X& r = *p;
p = get_some_other_p(); // might result in destroying r
use(r); // oops

答案 2 :(得分:2)

恕我直言,我认为这是一种可接受的做法(有一些警告 - 见Roger Pate's帖子)。如果你只为push_back()调用添加一行代码,那么我认为这是不可接受的。

但是,如果你发现你正在解释指针很多次,那么不仅可以将它解引用一次到可接受的引用对象中,它可能是性能获胜(取决于你的编译器,代码)问题,月亮的阶段等。)

答案 3 :(得分:1)

如果我实际上在做指针操作,那么我给它留下一个指针。 如果我的指针只是一个nilable引用,那么我留给它一个指针。 如果我确信或想要确保指针始终为非零 (即,如果我从方法返回非nil对象)那么 我通过使用引用来明确说明。

答案 4 :(得分:1)

从您提议的代码中恢复,我不同意:

shared_ptr<std::vector<int> > sp = get_sp_to_vector();
...
sp->push_back(5);

“非常难读”。它也比你的代码短。因此,尽管我认为定义和使用本地引用并没有太大的错误,但我也不认为你应该制定规则来永远这样做。

也许如果你的指针代码很难阅读,那是因为你错过了一些让它更简单的技巧。也许如果你用一个糟糕的指针代码示例提出另一个问题,你现在用引用修复它,那么SOers会找到替代修复。