Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ 通过值传递STL容器,调用代码是否看到更新?_C++_Stl_Pass By Reference_Copy Constructor_Pass By Value - Fatal编程技术网

C++ 通过值传递STL容器,调用代码是否看到更新?

C++ 通过值传递STL容器,调用代码是否看到更新?,c++,stl,pass-by-reference,copy-constructor,pass-by-value,C++,Stl,Pass By Reference,Copy Constructor,Pass By Value,如果我有这样的代码: void x(std::set<double> s){ s.insert(6.0); } int main(){ std::set<double> s; s.insert(5.0); x(s); //Would 6 be seen here? //Or would it only be seen if I had void x(std::set<double>& s)? } v

如果我有这样的代码:

void x(std::set<double> s){
    s.insert(6.0);
}

int main(){
    std::set<double> s;
    s.insert(5.0);
    x(s);
    //Would 6 be seen here? 
    //Or would it only be seen if I had void x(std::set<double>& s)?
}
void x(std::set s){
s、 插入(6.0);
}
int main(){
std::集s;
s、 插入(5.0);
十(s);
//这里会看到6吗?
//或者只有当我有void x(std::set&s)时才会看到它?
}
同样的答案适用于所有STL容器吗?那么用户定义的类呢?什么决定了在调用修改函数后是否可以看到对其状态的任何更改?

传递值(
f(T object)
)复制对象(值)并将其传递给调用函数。因此,从中调用它的函数看不到更改

通过引用传递(
f(T&object)
)将对象的位置(引用)传递给调用函数。因此,从中调用它的函数可以看到这些更改

按指针传递(
f(T*object)
)的行为方式与按引用传递相同,只是您使用
->
而不是
访问方法/变量


这适用于任何对象(STL、用户定义等)或普通数据类型(例如
int
)。

因此,当调用函数X时,STL集合的复制构造函数会复制集合“s”中的每个元素。如果要复制的元素是基元(即,不是指针),则X中的任何更改都不会在X之外看到。如果元素是指针(如果使用用户定义的类,情况就是这样),则更改将在X之外可见

这同样适用于所有STL类。STL类没有什么“神奇”之处,它们的操作方式与普通类相同


尝试使用复制构造函数创建您自己的“容器”类,并在调试器中逐步检查代码以查看发生了什么。这将类似于STL类中发生的情况。

6将在main中的集合中不可见

如果x的签名引用了void x(std::set&s),则可以看到

是的,这适用于几乎所有STL容器。STL容器使用值语义。在代码中通过值传递,这意味着创建了容器的副本。这可能是一个非常昂贵的操作,但意味着接收者可以更改他们获得的对象,而不必担心影响调用方的状态。尽管如此,它很少被执行,而且当它出现时常常是一个错误


一个函数改变其一个参数的状态,你需要通过引用,或者传递一个指向要改变的对象的指针(这是C程序员所做的,但是C++人大多避免)。如果你这样做了,你就不会问这个问题了。你说的“基元”是指包含一个普通的用户定义类对象,因为如果它被存储为一个值,我认为更新在函数外部是不可见的,改变它?