C++将取消引用指针对象分配给变量并使用该对象
C++ assign dereference pointer object to a variable and use that
大家好!
首先,我是一个全新的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 本身。
- 你能重载对象变量名本身返回的内容吗
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何使用std::lower_bound比较对象变量,而不使用第二个对象进行比较
- 将私有对象变量与用户输入的变量进行比较
- 具有已定义操作重载的 C++ 非类型化值对象/变量库
- 如何对对象数组进行排序,而不考虑对象变量类型
- 在功能中设置对象变量
- 如何创建对象变量,以便每次分配新的指针
- C++ FileIO 以读取和写入对象变量
- 私下声明的对象变量的突变器/访问器方法
- C++ 列表中的对象变量在迭代过程中不会更新
- 稍后使用私有对象变量时如何初始化数组(初始化对象后)
- 通过向量更改对象变量的值
- C 全局对象变量内存释放
- 基本数据类型变量 VS 对象变量
- C 复制分配运算符,用于参考对象变量
- c++从列表中移除元素,并将其分配给对象变量
- 我们是否需要在C++中同步局部对象变量
- 点运算符和箭头运算符之间的区别 结构对象变量 在 C 或 C++ 中创建树
- 无法访问在 std 回调中传递的对象变量