当前位置: 首页 > news >正文

c++ 类的语法3

测试下默认构造函数。demo1:

void testClass3() {class Demo { // 没显示提供默认构造函数,会有默认构造函数。public:int x; // 普通成员变量,可默认构造};Demo demo1;//cout << "demo1.x: " << demo1.x << endl; // 报错: C4700 使用了未初始化的局部变量"demo1"demo1.x = 9527;cout << "demo1.x: " << demo1.x << endl;Demo* demo2 = new Demo; // 调用的默认构造函数,或这样写Demo* demo2 = new Demo()demo2->x = 1314520;cout << "demo2.x: " << demo2->x << endl;
}

打印:

再一个demo,不能生成默认构造函数:

原因, Parent类中有成员变量demo,其无法默认构造。所以需要显示添加构造函数。

同理子类没有显示调用父类构造函数,但又无法引用父类默认构造函数,编译也报错:

原因就是编译器无法为Parent类生成默认构造函数,因为其成员变量demo无法默认构造(Demo类已有有参构造函数了,所以没有默认构造函数了)。

修改成这样,还是会编译报错,提示类Demo不存在默认构造函数。

原因是,在执行构造函数前,会先初始化成员变量,即如果未在初始化列表中显式指定成员对象的构造方式,编译器会‌强制尝试调用该成员对象的默认构造函数‌(无论是否实际需要)。

修改成下面这样就编译通过:

void testClass4() {class Demo { // 无默认构造函数private:int a;public:Demo(int a) {this->a = a;}int getA() {return a;}};class Parent { // Parent 没有显式构造函数 → 编译器无法生成默认构造public:Demo demo;  // 成员 demo 无法默认构造Parent(Demo demo):demo(demo) { // 初始化列表中进行初始化,所以这里不会调用Demo的默认构造函数,编译通过}};class Sub : public Parent {public:Sub(Demo demo): Parent(demo){}};Demo demo(9527);Parent parent(demo);cout << "parent a: " << parent.demo.getA() << endl; Sub sub(demo);cout << "sub a: " << sub.demo.getA() << endl;
}

打印:

相关文章:

  • YOLO11解决方案之对象裁剪探索
  • NoSQL数据库复习题目要点
  • upload-labs通关笔记-第8关 文件上传之点绕过
  • 卓力达电铸镍网:精密制造与跨领域应用的创新典范
  • 系统提示学习(System Prompt Learning)在医学编程中的初步分析与探索
  • 现场血案:Kafka CRC 异常
  • Linux补充之vscode连接远端主机
  • 基于 CSS Grid 的网页,拆解页面整体布局结构
  • 创意生图搭配酷炫特效,AIGC直播礼物多元玩法助力平台互动再升级
  • 前端图片自适应全攻略:从基础计算到工程实践
  • 维智定位 Android 定位 SDK
  • 使用 Docker 部署 React + Nginx 应用教程
  • MySQL 数据库优化:InnoDB 存储引擎深度解析:架构、调优与最佳实践
  • 支持蓝牙5.0和2.4G私有协议芯片-PHY6222
  • CSDN-2024《AGP-Net: Adaptive Graph Prior Network for Image Denoising》
  • 移植RTOS,发现任务栈溢出怎么办?
  • VSCode + Cline AI辅助编程完全指南
  • 灌区量测水自动化监测解决方案
  • Go语言实现生产者-消费者问题的多种方法
  • okcc呼叫中心系统搭建的方案方式
  • 马上评|文玩字画竞拍轻松赚差价?严防这类新型传销
  • 李峰已任上海青浦区委常委
  • 由我国牵头制定,适老化数字经济国际标准发布
  • 【社论】个人破产探索,要守住“诚实而不幸”的底线
  • 广州一饮品店取名“警茶”?市监局:取名没问题,但图像会产生误解
  • 英国收紧移民政策,技术工作签证、大学招生面临更严要求