Misaka3125 2024-08-07 16:58 采纳率: 0%
浏览 3

C++类对象作为类成员 提示没有默认构造函数出错

学习黑马程序员C++类对象作为类成员时
类person内包含一个phone类成员
person写了默认构造和有参构造 而phone只写了有参构造
下面调用person初始化了一个成员,为什么提示phone类没有默认构造函数?我也没有调用啊
而且当去掉person默认构造函数后就不报错了 求各位指导

#include <iostream>
using namespace std;
#include <string>
class phone
{
    string pname;
public:
    phone(string inputname):pname(inputname)
    {
        cout << "phone有参构造函数的调用" << endl;
    }
    ~phone()
    {
        cout << "phone析构函数的调用" << endl;

    }
};
class person
{

    string myname;
    phone myphone;
public:
    person()
    {

    }
    person(string name, string ppname) :myname(name),myphone(ppname)
    {
        
        cout << "person有参构造函数的调用" << endl;
    }
    ~person()
    {
        cout << "person析构函数的调用" << endl;
    }
};
int main()
{
    person p("张三","xiaomi");
    system("pause");
    return 0;
}

  • 写回答

1条回答 默认 最新

  • 清水白石008 2024-08-07 17:04
    关注
    🕒下午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:人到酬勤!
    

    在你的代码中,person 类包含一个 phone 类的成员 myphonephone 类只有一个有参构造函数,而没有默认构造函数。这就导致了在 person 类的默认构造函数中,编译器无法调用 phone 的构造函数。

    解释

    1. 默认构造函数:当你定义了 person 的默认构造函数时,编译器会尝试在构造 person 对象时,首先构造 myphone 成员。由于 myphonephone 类型,而 phone 没有默认构造函数,编译器会报错。

    2. 有参构造函数:当你定义了 person 的有参构造函数时,你在初始化列表中显式地调用了 phone 的有参构造函数(myphone(ppname)),这就解决了问题,因为你提供了必要的参数来构造 myphone

    解决方案

    如果你希望 person 类能够使用默认构造函数而不报错,你有几个选择:

    1. phone 类添加默认构造函数

      class phone {
          string pname;
      public:
          phone() : pname("default") {} // 默认构造函数
          phone(string inputname) : pname(inputname) {
              cout << "phone有参构造函数的调用" << endl;
          }
          ~phone() {
              cout << "phone析构函数的调用" << endl;
          }
      };
      
    2. **在 person 的默认构造函数中显式初始化 myphone**:

      person() : myphone("default_phone_name") { // 使用有参构造函数
      }
      
    3. 去掉 person 的默认构造函数,只保留有参构造函数,这样在创建 person 对象时,必须提供参数。

    总结

    在 C++ 中,当一个类包含另一个类的对象作为成员时,编译器会在构造外部类对象时自动调用内部类的构造函数。如果内部类没有默认构造函数,而外部类的构造函数没有显式调用内部类的构造函数,就会导致编译错误。希望这些解释能帮助你理解问题的根源!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月7日

悬赏问题

  • ¥15 疾病的获得与年龄是否有关
  • ¥15 关于浏览器控制台js报错问题-swiper.js相关
  • ¥15 opencv.js内存,CPU飙升
  • ¥15 植物重测序snp数据Treemix分析出现问题!
  • ¥15 怎么让当前页面只能有一人在编辑
  • ¥15 UCOSⅢ,3.0.3升级为3.0.4后程序编译成功,但是运行后死在统计任务的地方
  • ¥15 python程序长时间运行卡死,付费求解决方案
  • ¥20 VM打开不了ubuntu虚拟机,如何解决?
  • ¥15 java请求一个返回流式数据的接口,如何将流式数据直接返回前端
  • ¥15 为什么连接不了啊,配置都没问题啊