gpt4 book ai didi

c++ - 为什么函数不能更改其参数对象的地址/引用值?

转载 作者:行者123 更新时间:2023-11-30 00:48:54 25 4
gpt4 key购买 nike

我在 Java 和 C 中了解到,you can assign a pointer, pass the pointer to a method, follow the pointer in the method and change the data that was pointed to. However, you cannot change where that pointer points.

由于 C++ 的引用传递特性,我认为我可以在 C++ 中看到不同的行为,但我的代码似乎与上述声明一致...

void reassign(string & a);
int main()
{
string x = "abcd";
cout <<"x is " << x <<" at " << &x <<endl; //"x is abcd at 0x7bc7ebd5b720"
reassign(x);
cout <<"x is " << x <<" at " << &x <<endl; //"x is efgh at 0x7bc7ebd5b720"

}

void reassign(string & a)
{
a = string("efgh");
}

既然“string()”构造了一个新的字符串,为什么“reassign”函数不改变原字符串的地址呢?

最佳答案

一旦一个对象被分配,没有什么可以改变它的地址。您可以更改其内容(这是您的程序所做的),但地址将在对象的生命周期内保持不变。

如果您使用 new 动态创建一个对象,您将能够将不同的对象分配给同一个指针。但是,规则将保持不变:旧对象的地址不会改变,但您可以将新对象分配给旧指针。

void reassign(string* & a);

int main() {
string *x = new string("abcd");
cout <<"x is " << *x <<" at " << x <<endl; //"x is abcd at 0x95b7008"
reassign(x);
cout <<"x is " << *x <<" at " << x <<endl; //"x is efgh at 0x95b7030"
delete x;
return 0;
}

void reassign(string* & a) {
string *old = a;
a = new string("efgh");
delete old;
}

Demo.

关于c++ - 为什么函数不能更改其参数对象的地址/引用值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30358529/

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