我知道引用是语法糖,因此代码更容易读写.
但有什么区别?
以下答案和链接摘要:
NULL),而引用总是指对象.&obj + 5).澄清一个误解:
C++标准非常谨慎,以避免规定编译器如何实现引用,但每个C++编译器都将引用实现为指针.也就是说,声明如下:
Run Code Online (Sandbox Code Playgroud)int &ri = i;如果它没有完全优化,则分配与指针相同的存储量,并将地址
i放入该存储中.
因此,指针和引用都使用相同数量的内存.
作为基本规则,
有趣的读物:
假设我有一个Employee_Storage包含数据库连接数据成员的对象.该数据成员是应该存储为指针还是作为引用?
如果我将它存储为参考,我不需要进行任何NULL
检查.(无论如何,NULL检查有多重要?)
如果我将它存储为指针,则更容易设置Employee_Storage
(或MockEmployee_Storage)以进行测试.
一般来说,我一直习惯于将我的数据成员存储为引用.但是,这使得我的模拟对象很难设置,因为NULL我现在必须传入true/mock对象,而不是传入s(大概是在默认构造函数中).
是否有一个很好的经验法则,特别是关注可测试性?
可能重复:
为什么引用在C++中不可重定位
我试图或多或少交换两个引用变量(作为实践,我可以交换实际变量).我尝试通过创建一个临时变量并使其中一个引用与另一个相等来做到这一点,但这被编译器击落了.这是一个例子:
void Foo()
{
//code
int& ref1 = a;
int& ref2 = b;
int temp;
temp = ref1;
ref1 = ref2;
ref2 = temp;
//or, better yet
std::swap(ref1, ref2);
}
Run Code Online (Sandbox Code Playgroud)
我收到了一个错误,并查看了faq lite.它详细说明了它们无法重新安装,但没有解释原因.为什么?
这是Faq Lite的链接供参考(<---,得到它?).
int main()
{
int n = 1;
int* const p = &n; // ok
*p = 2; // ok as expected.
p = 0; // error as expected.
int& const m = n;
// error: 'const' qualifier may not be
// applied to a reference
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么 C++ 中没有 const 引用,就像 const 指针一样?
设计背后的原理是什么?
因此,一旦std::pair初始化了至少一个引用变量,例如像这样:
int a = 53;
int b = 42;
std::pair<int, int&> foo(33, a);
Run Code Online (Sandbox Code Playgroud)
有没有办法改变引用变量的指向?
任务:
foo = std::make_pair(33, std::ref(b));
Run Code Online (Sandbox Code Playgroud)
和交换:
std::pair<int, int&> bar(33, b);
foo.swap(bar);
Run Code Online (Sandbox Code Playgroud)
似乎只是将新内容移动到a并留下foo指向它之前 ( a)位置的第二个成员,因此没有做我在这里试图实现的目标。我知道引用不能像这里回答的那样反弹
,但这不是我在这里想要做的。我想要做的是制作一对新的并将其内容分配给现有的,这在技术上不是一回事。
提前致谢!
我有以下代码行,效果很好:
const auto& dict = m_DictionaryAbbreviationsAndEnglish.Content;
Run Code Online (Sandbox Code Playgroud)
现在我想引入一个"if-then"子句,但编译器告诉我"无法推断'auto'类型(需要使用initalizer):
const auto& dict;
if (uSkipAbbreviationsAndEnglish)
{
dict = m_DictionaryNoAbbreviationsNoEnglish.Content();
}
else
{
dict = m_DictionaryAbbreviationsAndEnglish.Content();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我像这样初始化它时......
const auto& dict=NULL;
Run Code Online (Sandbox Code Playgroud)
...,我无法使用此类代码分配"dict":
dict = m_DictionaryNoAbbreviationsNoEnglish.Content();
Run Code Online (Sandbox Code Playgroud)
错误是"表达式必须是可修改的l值".
任何人都可以告诉我如何正确地做到这一点?
谢谢.
ps:内容是这样的:
map<wstring,wstring> &clsTranslations::Content()
{
return m_content;
}
Run Code Online (Sandbox Code Playgroud)