“Object * obj”和“Object& obj”之间的区别

时间:2012-03-06 09:08:03

标签: c++

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

感谢:)

6 个答案:

答案 0 :(得分:2)

Trans &t = someVar;

使t成为对变量的引用。而

Trans t = someVar;

将调用Trans的复制构造函数并创建一个全新的对象。

有关详细信息,请参阅http://www.cprogramming.com/tutorial/references.html

答案 1 :(得分:2)

Trans &t = db[tid];

t的行为和db [tid]中的项目完全一样,你改变t,改变db [tid]

使用

Trans t = db[tid];

t只是db [tid]中项目的副本,更改t不会在此更改db [tid]。

答案 2 :(得分:1)

 Trans t = db[tid];

使用复制构造函数创建一个新对象。所有更改都将应用于此新对象。

 Trans& t = db[tid];

db[tid]的别名。对t的任何更改也将适用于db[tid]

答案 3 :(得分:1)

当vector :: operator []通过引用返回一个对象,然后使用

Trans &t = db[tid];

会更有效,因为它不会强制存储在矢量中的对象的副本 - 不像:

Trans t = db[tid];

但是,在第一种情况下,对't'的任何更改都将更改存储在向量中的对象。

答案 4 :(得分:0)

Trans &tTrans t之间的区别在于第一个是引用,它基本上是另一个变量的别名,在这种情况下,无论是什么被取出矢量。另一个是Trans t这是一个新变量,通过使用operator=复制数据来复制向量中的东西。

使用引用可避免使用Trans t时生成的副本。

答案 5 :(得分:0)

Trans &t = db[tid];

表示t是对象db[tid]的别名。别名是对象的不同名称,但左右值等于db[tid]的左右值。因此,如果您对t进行了一些修改,则会对db[tid]进行相同修改。

while:

Trans t = db[tid];

表示t是使用对象db[tid]的副本制作的。因此,如果您修改tdb[tid]将不会受到影响。