9)定义一个普通函数father,并在main测试如下。请解释编译错误原因,并提出修改方法。 分析在这个过程中,调用了几次构造函数,分别是哪个地方调用什么构造函数。 Person father(const Person& p) {p.change _addr(“Fuzhou”); Person wangwu( ”wangwu”,”China”,”234567”) ; return wangwu; } int main( ) {Person Lisi(”lisi”,”China”,”123456”); Lisi.change_addr(“Fuzhou”); Person dad=father(Lisi); return 0; }
时间: 2023-06-20 15:10:40 浏览: 145
以下是修改后的代码:
```cpp
#include <iostream>
#include <string>
using namespace std;
class Person {
private:
string name;
string country;
string phone;
string address;
public:
Person(string n, string c, string p) {
name = n;
country = c;
phone = p;
address = "";
}
Person(const Person& p) {
name = p.name;
country = p.country;
phone = p.phone;
address = p.address;
}
void change_addr(string addr) {
address = addr;
}
void print_info() {
cout << "Name: " << name << endl;
cout << "Country: " << country << endl;
cout << "Phone: " << phone << endl;
cout << "Address: " << address << endl;
}
};
Person father(const Person& p) {
Person wangwu("wangwu", "China", "234567");
wangwu.change_addr("Fuzhou");
return wangwu;
}
int main() {
Person Lisi("lisi", "China", "123456");
Lisi.change_addr("Fuzhou");
Person dad = father(Lisi);
dad.print_info();
return 0;
}
```
编译错误的原因是在 `father` 函数中,将局部变量 `wangwu` 返回了,但 `wangwu` 是在函数内部定义的,离开函数后就会被销毁,因此返回的实际上是一个已经不存在的对象,导致程序出错。
为了解决这个问题,可以将 `wangwu` 定义成 `Person` 类型的静态变量,这样它就会在函数外部被创建,直到程序结束才会被销毁。另外,为了避免修改 `Lisi` 的地址,可以将 `father` 函数中的 `p` 参数定义为 const 引用类型。
在这个过程中,调用了 4 次构造函数。第一次是在 `main` 函数中创建 `Lisi` 对象时调用了 `Person(string, string, string)` 构造函数;第二次是在调用 `father` 函数时,将 `Lisi` 作为参数传递给了 `father` 函数,因此会调用 `Person(const Person&)` 拷贝构造函数;第三次是在 `father` 函数中创建 `wangwu` 对象时调用了 `Person(string, string, string)` 构造函数;第四次是在将 `wangwu` 对象作为返回值返回时,会调用 `Person(const Person&)` 拷贝构造函数。
阅读全文