为什么我不需要将dereference运算符与map的.at()方法一起使用?

时间:2014-11-27 20:08:52

标签: c++ pointers vector map reference

在C ++中,我总是学会使用地址和解引用运算符,如下所示:

char s = 's';
char *t = &s;

t = 't'; // would be a compile error, because t must first be dereferenced
*t = 't'; // this works

那为什么会这样呢?

map<string, vector<char>> letters = {
    {"first", {'a', 'b', 'c'}},
    {"middle", {'l', 'm', 'n'}},
    {"last", {'x', 'y', 'z'}}
};
vector<char> section = letters.at("first");

我的理解是.at()返回对指定键处的映射元素的引用。为什么最后一行不能这样:

vector<char> *section = letters.at("first"); // this doesn't work!

然后,我可以继续使用section,使用.运算符而不是->运算符访问其方法,即使根据cplusplus.com它返回一个参考:

char first_letter = section.at(0); // not section->at(0);

这里发生了什么?我实际上是在vector内获得对map的引用吗?如果是这样,为什么我不需要使用箭头操作符取消引用返回的元素变量,以便可以调用其方法?

3 个答案:

答案 0 :(得分:4)

在C ++中,简而言之,引用是对象的别名,与指针不同。
通过取消引用指针,您可以访问指向对象(或引用)。
使用引用,您可以使用.运算符访问成员,并使用指针使用->运算符。

map<string, vector<char>>::at()返回vector<char> &(一个引用,实际上它将程序员视为一个实际对象,即好像它是vector<char>)。那不是vector<char> *(指向vector<char>对象的指针)。

答案 1 :(得分:3)

您对引用和指针感到困惑。 “解除引用”这个词的常见用法是&#39; dereference&#39;对你来说也没有帮助,因为你实际上不需要取消引用引用。 - (

您可以将引用视为指针,但添加了语法糖,隐藏了它的基础表示。

因此,如果您有int &iref = i;之类的引用,就可以像iref一样使用i

  iref = 42;
  iref += 100;

但是,如果你有一个指针,你必须使用解除引用运算符*

  *iref = 42;
  *iref += 100;

答案 2 :(得分:2)

at()返回引用,而不是指针:

vector<char> &section = letters.at("first");
char first_letter = section.at(0); 

您不能指定对指针的引用,但您可以在引用上使用&地址运算符来获取指向所引用项目的指针:

vector<char> *section = &(letters.at("first"));
char first_letter = section->at(0);