gpt4 book ai didi

c++ - [C++ 传值] : can the content of the original variables get modified by the called function?

转载 作者:行者123 更新时间:2023-11-28 07:32:05 24 4
gpt4 key购买 nike

我一直假设在 [c++] 中使用 [pass-by-value] 传递变量会生成它们的拷贝,因此接收这些拷贝的函数不能更改原始变量的内容。

我猜是因为当按值传递参数时,会调用[copy-constructor],如果程序员不重写,默认的[copy-constructor]会[shallow-copy]而不是[deep] -复制]!

所以我的问题是为什么他们称它为按值传递,而在类中有指针的情况下,该函数可以访问该指针的引用并可能损坏它。还有这个结论对吗? “只要类中有指针,并且您可以按值将该类的对象作为函数参数传递,请定义复制构造函数!”

如果这个错误是著名的,有人知道这个问题的名称或短语吗?

下面是我生成修改列表的代码。此类的对象包含一个 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. 然后打印 2 3 !

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++ - [C++ 传值] : can the content of the original variables get modified by the called function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17456484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com