[C++传递值]:被调用函数是否可以修改原始变量的内容
[C ++ pass-by-value]: can the content of the original variables get modified by the called function?
我一直认为,在[c++]中传递带有[pass-by-value]的变量会生成它们的副本,因此接收这些副本的函数不能更改原始变量的内容。
我想这是因为当参数通过值传递时,会调用[复制构造函数],如果程序员没有重写它,默认的[复制构造函数'会执行[浅复制]而不是[深度复制]!
所以我的问题是,为什么他们称它为pass-by-value,而在类中有指针的情况下,函数可以访问该指针的引用,并可能损坏它。这个结论正确吗?"只要类中有指针,并且可以按值传递该类的对象作为函数参数,就定义复制构造函数!"
如果这个错误很有名,有人知道这个问题的名称或短语吗?
下面是我的代码,它导致了一个修改的列表。此类的对象包含一个int成员变量以及指向节点成员变量列表的指针。
class ComplicatedObject{
public:
ComplicatedObject();
~ComplicatedObject();
//ComplicatedObject(const ComplicatedObject& c); // copy construtor
//ComplicatedObject& operator=(const ComplicatedObject& c); // =operator
int int_member_varialbe_; // an int member variable
void addToList(int d);
void printList();
private:
struct node{
int data;
node* next;
};
node* head_; // points to the beginning of a list (linkedlist of int)
};
下面的代码打印2。然后打印23!
Test.cpp:
void myfunction(ComplicatedObject obj){
obj.addToList(3);
obj.int_member_variable_ = 5;
}
int main(void){
ComplicatedObject c_object;
c_object.addToList(2);
c_object.printList(); //prints 2
cout << "int member variable befor passing:";
cout << c-object.int_member_variable_ << endl; //prints 6 (a default value)
myfunction(c_object); //pass-by-value
cout << "int member variable after passing:";
cout << c-object.int_member_variable_ << endl; // prints 6 (not 5)
c_object.printList(); // prints 2 3 ! List get changed!
return 0;
}
你是对的。浅复制(如果你的类缺少复制构造函数,就会发生这种情况)复制类中的指针,但不是它们指向的指针。如果你想正确地按值传递非常量对象,你必须定义一个执行深度复制的复制构造函数。
我一直认为在[c++],生成它们的副本,因此接收这些的函数副本不能更改原始变量的内容。
是的,这是真的。
我想这是因为当参数通过值传递时,调用了[copy constructor],如果它未被程序员,默认的[复制构造函数]会执行[浅复制]的[深度复制]!
"副本"是的"浅副本"。"副本"复制对象的所有内容。内容就是字段。如果字段是指针,那么内容就是指针,地址。就是这样。
所以我的问题是,为什么他们称之为传递值,而在在类中具有指针的情况下,函数可以访问引用该指针并可能损坏它。
那么呢?那些指针所指向的东西不是对象的一部分。所以这无关紧要。指针是对象的一部分。
所以我的问题是,为什么他们称它为pass-by-value,而在类中有指针的情况下,函数可以访问该指针的引用,并可能损坏它
让我们考虑以下情况:
int func(int b, int* c)
{
/* some stuff */
}
对于第一个参数b
,它是一个"ByVal"传递,所以编译器通常做的是
- 为
b
创建sizeof(int)
空间 - 将
b
复制到空间 func
可以在不影响原始b
的情况下修改b
的本地副本
这是必要的,因为如果它是"ByRef"自动传递的,当给定非L值(即1)时,编译器将遇到麻烦,因为您无法从常数值中获得引用。
现在让我们看看c
会发生什么。同样,它有一种类型的int*
,而不是int&
,所以它的处理方式与int b
相同。
但是,当c
是int*
指针时,它不会将除地址之外的任何其他数据存储到某个类型为int
的对象。因此,允许通过指针进行间接访问,并且只有地址的副本,而没有它指向的值,因此可能会损坏。
- 修改原始protobuf流
- 如何找到修改后的字符串与原始字符串相等的时间
- 有没有一种优雅的方法可以使用向量修改器并获得新的向量,而不是更改原始向量
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- Fixed_alpha_shape_3() 会破坏或修改原始三角测量吗?
- 我想知道像素/片段的原始模板值.零还是一个?如果可能的话,以获取哪些特定操作会修改模板值
- 有条件地传递修改后的副本而不是const原始副本变得丑陋
- 当我修改、更改和“删除”原始指针时,是否需要指针副本
- C++修改通过引用传递的类不会更改原始对象
- 打开一个文件,修改每个字符,然后执行反向操作不输出原始文件
- 操作员重载=修改原始对象
- 子向量修改原始向量
- 否定分数但不修改原始部分
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 创建指针的指针并在不修改原始指针的情况下对其进行修改
- [C++传递值]:被调用函数是否可以修改原始变量的内容
- 为什么取消引用unique_ptr不会修改原始对象
- ++和+=运算符不修改原始对象是否"incorrect behaviour"?
- C++ 重载运算符不修改原始对象(通过引用传递)