"Object *obj"和"Object &obj"的区别
The difference between "Object *obj" and "Object &obj"
graph.h
struct Edge {
int from;
int to;
unsigned int id;
Edge(): from(0), to(0), id(0) {};
};
struct Vertex {
int label;
vector<Edge> edge;
};
class Graph: public vector<Vertex> {
int gid;
unsigned int edge_size;
};
class Trans {
public:
int tid;
vector<Graph> graph;
};
vector<Trans> database;
database
是一个全局变量,那么我在 main 函数中调用 run_algo(database);
。
void run_algo(vector<Trans> &db) {
EdgeList edges;
for(unsigned int tid = 0; tid < db.size(); tid++) {
Trans &t = db[tid];
...
Graph g = t.graph[gid];
我想问db
是database
的别名,db[tid]
是事务向量,但是如果使用Trans &t = db[tid];
和Trans t = db[tid];
之间的区别怎么办,因为编写示例的作者使用Trans &t = db[tid];
,但我认为它应该使用Trans t = db[tid];
谢谢:(
之后
Trans &t = db[tid];
t 是和行为与 db[tid] 中的项目完全相同,你更改 t,你更改 db[tid]
跟
Trans t = db[tid];
t 只是 db[tid] 中项目的副本,更改 t 不会更改此处的 db[tid]。
Trans &t = someVar;
是否使t
成为对变量的引用。而
Trans t = someVar;
将调用Trans
的复制构造函数并创建一个全新的对象。
有关更多信息,请参阅 http://www.cprogramming.com/tutorial/references.html。
Trans t = db[tid];
使用 COPY 构造函数创建一个新对象。所有更改都将应用于此新对象。
Trans& t = db[tid];
是 db[tid]
的别名。对t
的任何更改也将应用于db[tid]
。
as vector::operator[] 通过引用返回一个对象,然后使用
Trans &t = db[tid];
将更有效,因为它不会强制复制存储在向量中的对象 - 不像:
Trans t = db[tid];
但是,在第一种情况下,对"t"的任何更改都将更改存储在向量中的对象。
Trans &t
和 Trans t
之间的区别在于,第一个是引用,它基本上是另一个变量的别名,在这种情况下,从向量中取出的任何内容。 另一个是Trans t
,这是一个新变量,其中向量中的内容通过使用operator=
复制数据来复制。
使用该引用可避免在使用 Trans t
时进行复制。
Trans &t = db[tid];
表示t
是对象的别名db[tid]
。 别名是对象的不同名称,但左右值等于db[tid]
的左值和右值。 因此,如果您对t
进行一些修改,您将对db[tid]
进行相同的修改。
而:
Trans t = db[tid];
表示t
是用对象db[tid]
的副本创建的,所以如果你编辑t
,db[tid]
不会受到影响。
- 如何在.obj文件上运行IlDasm?
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 在 opengl 中渲染 obj 文件时出现黑窗口
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- 正在读取 obj 文件!(指数)
- 我在主函数的左括号上不断收到错误,消息为obj\Debug\main.o||在函数"ZN11linked_listC1Ev"中:|
- C++将派生类转换为基类时'object slicing'期间发生的情况
- float* 已在 Gameobject.obj 中定义
- 可执行文件C++包括.obj,.lib和.dll吗?
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- C++成功复制动态分配的 obj 而不复制 ctor?
- OBJ 文件C++与 ubuntu 问题
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- Object obj = Object() 和 Object obj() 有什么区别?
- "Object *obj"和"Object &obj"的区别
- 构造函数 c++ Object obj = Object( "string" , 22);正在创建临时对象?