相关疑难解决方法(0)

C++中指针变量和引用变量之间有什么区别?

我知道引用是语法糖,因此代码更容易读写.

但有什么区别?


以下答案和链接摘要:

  1. 指针可以重新分配任意次数,而在绑定后无法重新分配引用.
  2. 指针可以指向nowhere(NULL),而引用总是指对象.
  3. 您不能使用指针来获取引用的地址.
  4. 没有"参考算术"(但您可以获取引用所指向的对象的地址,并对其进行指针运算&obj + 5).

澄清一个误解:

C++标准非常谨慎,以避免规定编译器如何实现引用,但每个C++编译器都将引用实现为指针.也就是说,声明如下:

int &ri = i;
Run Code Online (Sandbox Code Playgroud)

如果它没有完全优化,则分配与指针相同的存储量,并将地址i放入该存储中.

因此,指针和引用都使用相同数量的内存.

作为基本规则,

  • 使用函数参数和返回类型中的引用来提供有用的自我文档化接口.
  • 使用指针实现算法和数据结构.

有趣的读物:

c++ pointers reference c++-faq

3115
推荐指数
34
解决办法
94万
查看次数

如何更改C++引用所引用的变量?

如果我有这个:

int a = 2;
int b = 4;
int &ref = a;
Run Code Online (Sandbox Code Playgroud)

如何在此代码后ref引用b

c++ reference dynamic-rebinding

63
推荐指数
6
解决办法
5万
查看次数

什么时候最好将数据成员存储为引用而不是指针?

假设我有一个Employee_Storage包含数据库连接数据成员的对象.该数据成员是应该存储为指针还是作为引用?

  • 如果我将它存储为参考,我不需要进行任何NULL 检查.(无论如何,NULL检查有多重要?)

  • 如果我将它存储为指针,则更容易设置Employee_Storage (或MockEmployee_Storage)以进行测试.

一般来说,我一直习惯于将我的数据成员存储为引用.但是,这使得我的模拟对象很难设置,因为NULL我现在必须传入true/mock对象,而不是传入s(大概是在默认构造函数中).

是否有一个很好的经验法则,特别是关注可测试性?

c++ tdd pointers reference mocking

10
推荐指数
2
解决办法
7750
查看次数

为什么重新安装引用是非法/不道德的?

可能重复:
为什么引用在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的链接供参考(<---,得到它?).

c++ reference

3
推荐指数
2
解决办法
2693
查看次数

为什么 C++ 中没有 const 引用,就像 const 指针一样?

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 指针一样?

设计背后的原理是什么?

c++ standards pointers reference constants

3
推荐指数
1
解决办法
280
查看次数

有没有办法改变 std::pair 的引用成员指向的位置?

因此,一旦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)位置的第二个成员,因此没有做我在这里试图实现的目标。我知道引用不能像这里回答的那样反弹 ,但这不是我在这里想要做的。我想要做的是制作一对新的并将其内容分配给现有的,这在技术上不是一回事。

提前致谢!

c++

3
推荐指数
1
解决办法
89
查看次数

不能推断const auto&

我有以下代码行,效果很好:

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)

c++ auto

2
推荐指数
1
解决办法
178
查看次数