2015-10-05 122 views
0

我这个struct定义:会发生什么成员

template<class T> 
struct Node { 
    T value; 
    Node(const T& v) : value(v) {} 
}; 

我想知道,当我做

int i = 3; 
Node<int>* my_node = new Node<int>(i); 

到底发生了什么打印出地址i和地址my_node->value我意识到他们不指向相同的地址。我的确希望这种行为,因为强制我的新指针被放置在特定的地址是没有意义的,以便能够包裹我的传递引用参数!

但我想知道&有什么作用?只是为了确保参数在传递给方法时不被复制?如果是的话,那是为了避免重复复制?还是有另一个目的使用&

value(v)value = v只需将整个数据类型复制到新的存储空间中,无论v是否通过引用传递,我是对吗?

编辑:我很抱歉,我试图缩短我的代码,并最终使其模糊。只是修复它。

+0

首先,引用与地址无关。有时参考地址会产生与其所反对的对象相同的地址,有时候不会。但在你的例子中,你甚至错误地开始 - 你的'int值'不是一个引用,它是它自己的一个对象。 – SergeyA

+0

请让你的变量名一致,我不能跟随这个问题。 –

+0

@MarkRansom感谢您的注意。修正了它 – Yalda

回答

1

该声明形式很糟糕:Node * my_node = new Node(i);

但我想知道&的作用是什么?只是为了确保 参数在传递给方法时不被复制?如果是的话,那么 只是为了避免繁重的拷贝(在这个例子中,除了int 以外的大数据类型)?还是有另一个目的使用&?

&在这种情况下的作用与您所说的完全相同。我使用的一般经验法则是通过值传递内置函数(例如int,double),并通过const引用传递所有内容以避免不必要的复制。

和价值(V)或值= V只是整个数据类型复制到新 的内存空间,如果V是通过引用传递与否,不管我是 吧?

这也是正确的。但是对于非内置插件,这两个语句在构造函数中使用时会有所不同。首先是初始化,并在初始化列表中完成(在您的示例中已完成),后者是赋值并在构造函数体中完成。对于非内置插件,使用初始化列表通常更高效。否则,在执行分配之前,该对象将被默认初始化。

+0

感谢您的详细解释。你能告诉我为什么'Node * my_node = new Node(i)'不好和/或什么是更好的形式? – Yalda

+1

模板声明正确使用T.但是,当使用模板时,您需要指定代码应该是的类型:节点 my_node = new节点(i); –