将按引用传递的变量分配给结构成员时会发生什么
What happens when assigning passed-by-reference variable to struct member
我定义了这个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
只需将整个数据类型复制到新内存space,无论v
是否通过引用传递,我是对的?
编辑:很抱歉,我试图缩短我的代码,但最终使它变得模棱两可。刚刚修好了。
此语句格式错误:Node* my_node = new Node(i);
But I'm wondering what's the role of &? Is it just to make sure
argument is not copied when passed to the method? And if yes, is that
just to avoid heavy copying (in case of a big datatype other than int
in this example)? Or is there another purpose for using &?
&在这种情况下的作用正如你所说。我使用的一般经验法则是按值传递内置函数(例如 int、double)并通过 const 引用传递其他所有内容以避免不必要的复制。
And value(v) or value = v simply copy the whole datatype into a new
memory space, no matter if v is passed by reference or not, am I
right?
也对。但是对于非内置函数,这两个语句在构造函数中使用时会有所不同。第一个是初始化并在初始化列表中完成(您在示例中已完成),后者是赋值并在构造函数主体中完成。对于非内置函数,通常使用初始化列表更有效。否则,对象会在您进行赋值之前默认初始化。
我定义了这个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
只需将整个数据类型复制到新内存space,无论v
是否通过引用传递,我是对的?
编辑:很抱歉,我试图缩短我的代码,但最终使它变得模棱两可。刚刚修好了。
此语句格式错误:Node* my_node = new Node(i);
But I'm wondering what's the role of &? Is it just to make sure argument is not copied when passed to the method? And if yes, is that just to avoid heavy copying (in case of a big datatype other than int in this example)? Or is there another purpose for using &?
&在这种情况下的作用正如你所说。我使用的一般经验法则是按值传递内置函数(例如 int、double)并通过 const 引用传递其他所有内容以避免不必要的复制。
And value(v) or value = v simply copy the whole datatype into a new memory space, no matter if v is passed by reference or not, am I right?
也对。但是对于非内置函数,这两个语句在构造函数中使用时会有所不同。第一个是初始化并在初始化列表中完成(您在示例中已完成),后者是赋值并在构造函数主体中完成。对于非内置函数,通常使用初始化列表更有效。否则,对象会在您进行赋值之前默认初始化。