通过引用传递是一种参数编组策略,其中变量在内存中的位置传递给函数,而不是变量值的副本,尽管函数出现在源代码中以接收变量本身而不是指向它的指针。
既然java只传递值而不传递引用,为什么当我们将数组传递给方法时,它内部的变化也会反映在main中
当数组传递给方法时,该方法接收什么? 我遇到了这个问题,我认为答案必须按值传递,就像将副本传递给方法一样,无论我们何时更改......
我需要创建一个哈希图,将对其他对象的引用存储为值,并将这些对象的名称作为键(HashMap)。 整个系统就像一个迷你车...
我一直在阅读复制和移动语义,以提高我对何时使用 T 与 T const & 与 T && 的了解 我写了一小段测试代码来验证我的直觉 #包括 我一直在阅读复制和移动语义,以提高我对何时使用 T vs T const & vs T && 的了解 我写了一小段测试代码来验证我的直觉 #include <iostream> #include <utility> #include <vector> template< int i > struct Example { Example(){ std::cout << "("<< i<<") was made\n"; } Example( Example const & ){ std::cout << "("<< i<<") was copied\n"; } Example( Example && ){ std::cout << "("<< i<<") was moved\n"; } ~Example(){ std::cout << "("<< i<<") was destroyed\n"; } std::vector< int > x = {1,2,3,4}; }; template< int i > struct Test { Example< i > example; // Test( Example< i > example ): example( example ) {} // Test( Example< i > const & example ): example( example ) {} // Test( Example< i > && example ): example( std::move(example) ) {} }; int main() { Example<1> example1; Example<2> example2; std::cout << "Test1\n"; Test test1{ example1 }; std::cout << "Test2\n"; Test test2{ std::move(example2) }; std::cout << "Test3\n"; Test test3{ Example<3>() }; std::cout << "Tests done \n"; } 这会产生我期望的输出: (1) was made (2) was made Test1 (1) was copied Test2 (2) was moved Test3 (3) was made Tests done (3) was destroyed (2) was destroyed (1) was destroyed (2) was destroyed (1) was destroyed g++ -std=c++20 -O3 向 Test 添加显式构造函数 Test( Example< i > const & example ): example( example ) {} Test( Example< i > && example ): example( std::move( example ) ) {} 仍然符合我的直觉,因为现在只有复制和移动,test3现在诉诸于使用移动。 但是当仅定义以下构造函数时 Test( Example< i > example ): example( example ) {} 我明白了 (1) was made (2) was made Test1 (1) was copied (1) was copied (1) was destroyed Test2 (2) was moved (2) was copied (2) was destroyed Test3 (3) was made (3) was copied (3) was destroyed Tests done (3) was destroyed (2) was destroyed (1) was destroyed (2) was destroyed (1) was destroyed 虽然我能理解example1的额外副本,但它对我来说仍然显得很奇怪。然而,与example3发生的事情结合起来是没有意义的,我要么也期望两份副本,要么移动。 我一直有这样的印象: 如果您计划获取资源的副本,则按值传递,并且如果将临时值传递给此函数,则编译器可以使用移动,甚至就地构造对象 如果您计划仅查看对象 (const &) 或者计划设置值,则可以通过左值引用传递。 如果您计划获得资源的所有权,则可以传递右值引用。 在这个例子中,情况似乎并非如此,如示例中给出的 Example 包含一个向量,因此复制不是最轻的操作,移动会更好。 所以我的问题总结是: 为了避免昂贵的副本并允许就地构建,什么时候应该使用T、T&、T const &和T&&(也许是T const &&)。 这也是在函数的上下文中,而不仅仅是构造函数。 (注意:在构造到位后,我的意思是最初 test3 所示的现象,其中临时对象既没有移动也没有复制到 test3 中) 总之,优先参考T&,除非字体很小,比如int。如果调用者代码不会使用该类型,请考虑 T&& + std::move()。 代码的简单性比速度更重要,除非您测量到这是程序的热点。 您在评论中链接的 C++ 核心指南:https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#fcall-parameter-passing
我正在玩python,尝试使用各种方法来减少内存使用。出现的一个问题是是否有一种方法可以传递列表切片作为对原始列表的引用。 原因是
我正在观看 JavaScript 演讲,导师说如果我们在函数中传递对象的属性,它实际上会改变实际值,因为我们将通过引用传递变量...
为什么 cin 没有像 C 中的 scanf() 那样的 & 运算符或说明符格式?
就像我在学习C++动态内存分配时遇到了这个疑问,现在就无法再专注于学习它了。 :( 整数 n; 计算<< "Enter array size: "; c...
使用具有按引用传递构造函数参数的类初始化向量,并将该引用保存为成员
我试图创建一个在向量中的项目之间共享的类型的单个实例。每个向量的项类型都需要在构造函数中传递引用参数...
我是C初学者,我试图创建一个修改结构体指针内容的函数,但它无法成功,相反,内容保持不变。 这是我的代码: #包括 #
如何使用 std::reference_wrapper 将引用存储在 std::unordered_map 中?
我正在尝试学习 std::reference_wrapper 和 std::ref 的使用及其用例。 这是我编写的示例代码。请帮我解决编译错误。如果可以的话那就太好了
如何使用 std::reference_wrapper 将引用存储在 unordered_map 中?
我正在尝试学习 std::reference_wrapper 和 std::ref 的使用及其用例。 这是我编写的示例代码。请帮我解决编译错误。如果可以的话那就太好了
如何使用 std::reference_wrapper 将引用存储在 unordered_map 中?
我正在尝试学习 std::reference_wrapper 和 std::ref 的使用及其用例。 这是我写的示例代码,请帮我解决编译错误,如果你ex的话那就太好了...
在其他编程语言中,我们使用 & 关键字通过引用传递变量。 例如,在 php 中; $a = 10; 函数某事(&$a){ $a = 7; }; 某事($a); 回显 $a; // ...
有人可以在下面的代码中解释我,为什么当我执行 o = {} 时,对象没有被重置? var funky = 函数 (o) { o.z = 空; o.a =“aaa”; o = {}; }; var x = { z: ...
揭示编译器在传递给引用与传递给 const 引用时所做的事情
编译下面所示的代码,并检查反汇编(objdump -DSs a.out > a.dis),我看不到调用 fun_ref(T &) 和 fun_const_ref(cons...
让我打破如果标题令人困惑,我们可以用c++编写函数吗,像这样的东西,可能不完全像这样,语法可能不同 void FunctionTest(int param1, _Inout_ int& param...
std::get_if (std::variant) 通过指针而不是通过值/&/const& 获取变体参数是否有任何实际原因?
我从未使用过 std::get_if,并且由于它的名称与 std::get 不同,我看不出它的参数应该是指针的原因(而 std::get 有一个按引用范围)。 ``如果是n...
我无法将对 std::ostream 的引用传递给类构造函数并将其分配给引用成员变量。 我有两个文件: // ./include/HelloWorld.hpp #ifndef __HELLOWORLD_H__ #
我无法将对 std::ostream 的引用传递给类构造函数并将其分配给引用成员变量。 我有两个文件: // ./include/HelloWorld.hpp #ifndef __HELLOWORLD_H__ #
使用接受指针引用的 C++ 模板函数作为参数时出现奇怪的编译错误
一开始我会指出,我确实花了很多时间试图在网上寻找答案,我什至要求聊天GPT 4向我解释这个问题,但它无法给我答案,所以请不要' t do...
我正在查看用 C++ 编写的 API,我对以下参数类型的含义感到困惑: 无效*&*数据 这是否意味着用户将传递对 void 指针的引用?如果...