c++ 类的语法3

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

cpp 复制代码
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不存在默认构造函数。

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

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

cpp 复制代码
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;
}

打印:

相关推荐
AlunYegeer25 分钟前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
浅念-40 分钟前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
hixiong1231 小时前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#
DFT计算杂谈1 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
EW Frontier2 小时前
6G ISAC新范式:基于智能漏波天线的Wi‑Fi通感一体化系统设计与实测【附MATLAB+python代码】
开发语言·python·matlab·music·isac·doa·wi‑fi
楼田莉子2 小时前
Linux网络:NAT_代理
linux·运维·服务器·开发语言·c++·后端
南境十里·墨染春水2 小时前
C++日志 2——实现单线程日志系统
java·jvm·c++
froginwe112 小时前
jEasyUI 创建基础树形网格
开发语言
zh_xuan2 小时前
api测试工具添加历史记录功能
c++·libcurl·duilib
休息一下接着来3 小时前
C++ 固定容量环形队列实现
c++·算法