Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将局部变量传递给C+;中函数的最佳方法+;_C++_Parameter Passing - Fatal编程技术网

C++ 将局部变量传递给C+;中函数的最佳方法+;

C++ 将局部变量传递给C+;中函数的最佳方法+;,c++,parameter-passing,C++,Parameter Passing,我只是想知道将局部变量传递给函数的最佳方法是什么 void check2 (int* var2){ *var2=7; } void check1 (int& var){ var=6; } int main() { int var; int* var2=new int; check1(var); check2(var2); delete var2; return 0; } 在check1中,我使用引用传递变量。当我

我只是想知道将局部变量传递给函数的最佳方法是什么

void check2 (int* var2){
    *var2=7;
}

void check1 (int& var){
    var=6;
}

int main()
{
    int var;
    int* var2=new int;

    check1(var);
    check2(var2);

    delete var2;

    return 0;
}
check1
中,我使用引用传递变量。当我将一个局部变量传递给函数
check1
时,一旦main终止,它就不会超出范围,不再有变量了吗

我发现了几个例子,其中使用
操作符new
分配内存并返回指针,然后将指针传递给函数。如果变量没有被擦除,那么这是执行相同任务的更好方法吗

将局部变量传递给函数的最佳方法是什么

这取决于传递变量的原因以及如何处理它

传递引用意味着函数不拥有对象的所有权,而函数显然不拥有对象的所有权,因此这是适当的。传递裸指针对于所有权的更改是不明确的,所以在这种情况下,引用更好

当我将一个局部变量传递给函数check1时,一旦main终止,它不会离开作用域,并且不再有变量了吗

对。但是,对象是否在
main
返回后存在,主要与如何将对象传递给
main
中的函数的问题正交

还要注意,在
main
返回后,整个程序即将终止。唯一的情况是,如果该对象由另一个具有静态存储的对象的析构函数依赖,那么此时仍然需要一个对象存在

我发现了几个例子,其中new操作符用于分配内存并返回一个指针,然后将该指针传递给函数。如果变量没有被擦除,那么这是执行相同任务的更好方法吗

如果确实需要在
main
中创建一个对象,但需要在
main
完成后该对象才存在,那么动态分配是实现这一点的一种方法。静态存储可能是另一种选择


但是,在本例中,您删除了main中的对象,因此它会像局部变量一样被销毁,因此在本例中,动态分配没有任何优势。

没有最佳方法。使用指针语法可以更清楚地表明变量是通过引用传递的。在引用语法中,代码是干净的。当main终止时,程序中的每个变量都会被销毁。使用
new
或not与将变量传递给函数无关。否!不要做不必要的动态分配!没有赤裸裸的指针!为什么您担心在main超出范围后使用变量。在main超出范围后您可能会做什么?但是在main完成后需要该对象存在。某些对象如何能够比main更长寿
main
结束程序,该程序结束所有的生命周期。@NathanOliver,不是真的。静态对象比主对象寿命长。(想想毁灭者)否决这个答案是不公平的。答案是正确的。@NathanOliver在
main
返回后,程序直到静态对象的析构函数运行后才结束。假设其中一个静态对象可能引用在
main
中创建的对象,析构函数可以依赖于引用的对象。标准流的析构函数(
std::cout
std::cerr
std::cin
等)在
main()
返回后调用,实际上,在所有流的析构函数返回后调用(用户定义的)静态对象。这是这些流可以安全地用于(用户定义的)静态对象的析构函数的原因之一。除此之外,输出流的析构函数(如
std::cout
)会在对象生命结束前刷新缓冲区。