将引用传递变量赋值给结构成员时会发生什么
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
简单地复制整个数据类型到一个新的内存空间,不管v
是否通过引用传递,我是对的吗?
编辑:我很抱歉我试图缩短我的代码,最终使它模棱两可。刚刚修好了。
这个语句格式错误:Node* my_node = new Node(i);
但是我想知道&的作用是什么?只是为了确认一下吗参数传递给方法时不复制?如果是,那是只是为了避免大量复制(在大数据类型不是int的情况下)在这个例子中)?或者使用&还有其他目的吗?
&在这种情况下,正如你所说的。我使用的一般经验法则是,通过值传递内置(例如int, double),并通过const引用传递其他所有内容,以避免不必要的复制。
和value(v)或value = v只是复制整个数据类型到一个新的无论v是否通过引用传递,内存空间都是I对吧?
这也是正确的。但是对于非内置函数,这两个语句在构造函数中使用时是不同的。第一个是初始化,在初始化列表中完成(在示例中已经完成),后一个是赋值,在构造函数体中完成。对于非内置函数,通常使用初始化列表更有效。否则,在执行赋值操作之前,对象将被默认初始化。
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 常量公共成员有什么问题?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 什么可以防止类中相邻成员重叠
- 指针类型类成员的动态强制转换的恒定性是什么?
- 删除类成员的动态分配内存的最佳方法是什么
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- 初始化类成员的更好做法是什么?
- 键入擦除成员函数指针的"right"方法是什么?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 使用只有一个成员的工会的目的是什么?
- 什么是指向成员模板参数的指针
- 常量成员和没有setter的私有成员之间有什么区别
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 为什么我应该在scanf()-家族成员中包含一个长度修饰符作为参数?有什么好处?使用长度修改器进行扫描的作用
- 命名空间 Win 没有成员"simpleControl"是什么意思
- constexpr静态成员什么时候停止成为constexpr