"Object *obj"和"Object &obj"的区别

The difference between "Object *obj" and "Object &obj"

本文关键字:obj Object 区别      更新时间:2023-10-16

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];    

我想问dbdatabase的别名,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 &tTrans 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]的副本创建的,所以如果你编辑tdb[tid]不会受到影响。