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++人大多避免)。如果你这样做了,你就不会问这个问题了。你说的“基元”是指包含一个普通的用户定义类对象,因为如果它被存储为一个值,我认为更新在函数外部是不可见的,改变它?