C++编译器何时为用户提供默认构造函数
第一种是类成员中有成员是类对象,并且该成员的类含有默认构造函数,那么C++编译器会帮你给这个类也生成一个默认构造函数,用来调用其成员对象的构造函数,完成该成员的初始化构造。需要强调的是,如果这个成员的类也没有给出默认构造函数,那么C++编译器也不会帮你生成该类的默认构造函数。
第二种情况是这个类的基类有默认构造函数。那么C++编译器也会帮你生成该派生类的默认构造函数,以调用基类的默认构造函数,完成基类的初始化。另外还得强调一下的是,如果基类没有提供这个默认构造的函数,那么C++编译器也不会为派生类生成默认的构造函数(这里包括两层意思,第一,基类没有任何形式构造函数;第二,基类存在其他形式的非默认构造函数,当然了,这种类型就是编译不过的,道理很明显)。
第三种情况是类中存在虚函数,那么C++编译器会为你生成默认构造函数,以初始化虚表(虚函数表vftable)。
第四种情况是存在虚基类,那么C++编译器会为你生成默认构造函数,以初始化虚基类表(vbtable)。
下面的例子中,就是因为基类A中没有提供默认构造函数,导致编译无法通过,为基类A添加上默认的构造函数后,编译就通过了。。
#include "iostream"
using namespace std;
class A
{
public: A() { } //基类添加上默认构造函数就可以了 A(int c) { x=c; cout<<"A"<<endl; } void fun() { cout<<"in A fun"<<endl; }
private: int x;
}; class B:public A
{
public: B(int c) { y=c; cout<<"B"<<endl; } void fun() { cout<<"in B fun"<<endl; }
private: int y;
};
int main(void)
{ A *a=new B(2); system("pause"); return 0;
}
C++编译器何时为用户提供默认构造函数相关推荐
- 2020-12-18(何种情况下编译器会提供默认构造函数)
当问到大家什么时候会提供默认构造函数时,有的人会不会一下子就想到当我们没有定义构造函数的时候,它就会提供默认的构造函数,但我们想想一个问题,假如没有意义的情况下提供了默认构造函数,那是不是把编译器搞得 ...
- C++编译器会对没有构造函数的类生成默认构造函数吗?
之前在上C++的课的时候,印象中有那么一句话: 如果一个类没有任何构造函数,那么编译器会生成一个默认的构造函数 今天在看<深度探索C++对象模型>的第二章:"构造函数语意学&qu ...
- C++默认构造函数的合成
默认构造函数的误解 1.当程序猿定义了默认构造函数,编译器就会直接使用此默认构造函数 来一个简单的栗子 class Student; class School { public: School(){} ...
- 类的构造函数和析构函数、默认构造函数
前言 程序只能通过成员函数来访问数据成员,因此需要设计合适成员函数,才能成功地将对象初始化. 类构造函数专门用于构造新对象,将值赋给他们的数据成员,进行初始化. 构造函数名称与类名相同,没有返回值,没 ...
- Java默认构造函数的作用
Java默认构造函数的作用,有需要的朋友可以参考下. class Person{private String name="";private int age=0;public Pe ...
- c++ 虚函数_到底什么情况下会合成默认构造函数?
来源:https://www.cnblogs.com/QG-whz/p/4676481.html 作者:good luck 编辑:公众号[编程珠玑] 编辑注:没有构造函数的时候编译器一定会生成默认构造 ...
- C++默认构造函数的一点说明
大多数C++书籍都说在我们没有自己定义构造函数的时候,编译器会自动生成默认构造函数.其实这句话我一直也是 深信不疑.但是最近看了一些资料让我有了一点新的认识. 其实我觉得大多数C++书籍之所以这样描述 ...
- C++学习——默认构造函数
默认构造函数在这篇博客中已经写得很明白. https://blog.csdn.net/bear_n/article/details/72798301 文章目录 1.什么是默认构造函数? 2.什么情况会 ...
- C++ 合成默认构造函数的真相
http://www.cnblogs.com/QG-whz/p/4676481.html 对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个 ...
最新文章
- Scrapy框架的入门使用
- python 笔记:if __name__==‘main’
- springcloud 服务与服务之间实现灰度发布 基于Aspect
- [HNOI2010]BOUNCE 弹飞绵羊
- 【ArcGIS Pro微课1000例】0014:两种坐标系全国1km分辨率DEM下载地址(WGS84+Albers投影)
- [Swift]LeetCode1035.不相交的线 | Uncrossed Lines
- pthread_attr_init线程属性
- 10个简单步骤,完全理解SQL
- C++ 沉思录——Chap4:设计类的核查表
- python中的range与xrange
- Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)
- centos7 firewalld
- Python中终端彩色打印输出
- 二维联合分布(X,Y)求(U,V)
- 如何在金蝶服务器增加用户,详解金蝶KIS记账王如何新增用户
- CATIA软件有限元分析功能详解及使用教程
- LDC1101 LDC1314 LDC1614 1612 线圈感应测试(PCB+源码)
- 第一篇:wine介绍
- 磁盘介质受写入保护解决办法
- Infor和C3 AI建立战略合作伙伴关系,提供可扩展的企业AI行业应用