C++将取消引用指针对象分配给变量并使用该对象

C++ assign dereference pointer object to a variable and use that

本文关键字:对象 变量 分配 取消 引用 指针 C++      更新时间:2023-10-16

大家好!

首先,我是一个全新的C++,来自基本的C背景,所以我为什么问这个可能有点奇怪。

使用场景是,我想通过将映射作为指向该函数的指针传递来更改不同函数内的映射。因为我重用了别人的代码,所以将取消引用分配给变量比更改所有引用更容易。这会导致类似的情况:

using namespace std;
typedef map<long, double> tl_t;
void fillmap(tl_t* m_p) {
    tl_t m = *m_p;
    m.insert(pair<long, double>(4, 3.0));
}
int main(int argc, char** argv) {
    tl_t m;
    cout << "Size: " << m.size() << "n";
    fillmap(&m);
    cout << "Size: " << m.size() << "n";
    return 0;
}

有趣的是,现在两个 Size: 字符串都返回 0,并且主函数中的原始映射 m 似乎没有改变。但是,这有效:

using namespace std;
typedef map<long, double> tl_t;
void fillmap(tl_t* m) {
    (*m).insert(pair<long, double>(4, 3.0));
}
int main(int argc, char** argv) {
    tl_t m;
    cout << "Size: " << m.size() << "n";
    fillmap(&m);
    cout << "Size: " << m.size() << "n";
    return 0;
}

据我所知,这两种情况应该与主 m 和填充映射函数中对同一对象的引用相同。当然,两个 m 变量位于不同的位置,但应该引用同一个对象。

在我写这篇文章时,可能有问题的一件事是 main AND 中的变量 m 是 map 对象,而 fillmap 中的变量 m 尝试成为 map 对象,但不能,因为取消引用 m_p 指针并将其分配给最后一个 m 实际上并没有使最后 m 成为对同一对象的引用,而是实际上复制了它。我在这里走在正确的轨道上吗?

是的,我确实知道在正常用例中您应该在类似情况下使用参数引用,但这:P

让我大吃一惊。

希望有人能启发我!

在C++中,你必须添加并明确表示变量是引用。

在您的示例中:

tl_t& m = *m_p;

应该有帮助。

如果您只使用"tl_t",则可以创建对象的本地副本,一旦离开fillmap函数,该副本就会被销毁。

例:

struct X {
  int a,b;
}

现在类型:

  • X - 在内存中同时包含 a 和 b 值的位置。
  • X& - 在内存中放置包含指向 X 的引用(const 指针)。
  • X* - 放置在包含指向 X 的指针的内存中。

在X和X&中,你可以使用dot(xobject.a,xobject.b)访问类的字段,但这些不是相同的类型。

这是因为

tl_t m = *m_p;

m将通过调用复制构造函数来构造,则复制过程是按值构造的。您只需将pair<long, double>(4, 3.0)插入 m,而不是m_p然而

(*m).insert(pair<long, double>(4, 3.0))

*m 是通过指针传入的对象,因此,pair<long, double>(4, 3.0)入到 *m 本身。