Step1:写个空类

class CBlueSky{};

注:sizeof(CBlueSky) 等于 1

Step2:编译器可能会为CBlueSky空类声明以下函数/操作符:如果默认构造函数,拷贝构造函数,析构函数,赋值操作符,如下所示:

class CBlueSky{

public:

CBlueSky() { ...} // 默认构造函数

CBlueSky(const CBlueSky& other) {...} //拷贝构造函数

~CBlueSky(){...} //析构函数

CBlueSky& operator = (const CBlueSky& other) {...} //拷贝赋值操作符

};

注:这些函数都是pubic且inline函数!

注:sizeof(CBlueSky) 等于 1,抛个问题:思考下类的size问题。

Step3:上面的“可能会“如何理解?

当这些函数被需要时,在编译阶段会被编译器声明创建出来。被需要的示例如下所示:

CBlueSky a1; //需要 默认构造函数

//声明周期结束时,需要 析构函数

CBlueSky a2(a1);  //需要 拷贝构造函数

a2 = a1; //需要 拷贝赋值操作符

如果这时候你的CBlueSky是空类,则编译器会声明以上这些函数。

如果这时候你的CBluseSky已经实现了这些函数,编译器只进行编译操作,不会再声明这些函数。

Step4:如果CBlueSky类如果定义了构造函数,编译器不会再为CBlueSky声明创建任何构造函数。

//< BlueSky.h
#ifndef __BLUESKYJOYN_BLUESKY_H_
#define __BLUESKYJOYN_BLUESKY_H_namespace BlueSkyJoyn {class CBlueSky {
public:CBlueSky(int age);private:int        m_age;
};}
#endif
//< BlueSky.cpp
#include "BlueSky.h"namespace BlueSkyJoyn {CBlueSky::CBlueSky(int age):m_age(age)
{}}int main()
{BlueSkyJoyn::CBlueSky a1;return 0;
}

main中的a1需要调用无参默认构造函数,但是CBlueSky已经有了构造函数(但没有默认构造函数),编译器不会再为CBlueSky创建无参默认构造函数,而是提示error,编译失败。

Step5:没有拷贝赋值操作符,编译器给你声明创建,看下例:

上面main换成下面,可以通过编译

int main()
{
//BlueSkyJoyn::CBlueSky a1;
BlueSkyJoyn::CBlueSky a1(25);
BlueSkyJoyn::CBlueSky a2 = a1; //调用copy assignment操作符,没有声明定义,编译器为你声明创建

return 0;
}

注:由于没有调用到拷贝构造函数,编译器不会为你声明创建copy constructor。

Step6:编译器不会随意给你创建copy constructor,他也要遵守C++规则。

C++规则,先看一个,如下所示:

1)引用初始化后不允许 指向其他不同的对象,如:

int i = 1;

int j = 2;

int  &ri = i;

ri = j; // wrong!!!!, C++不允许让ri指向其他int对象

由上可知,如果CBlueSky类中有reference成员时,编译器为了遵守C++的“reference对象 不允许指向其他对象”规则,不会为其生命创建拷贝赋值操作符!

2)如果类中有"内含const 成员,则编译器也会拒绝为其创建operator=操作符

3)如果base-class的operator=是private,则编译器拒绝为其derived-class声明创建operator=操作符

综上所述:编译器可以“润物细无声”地为一个类创建默认构造函数,拷贝构造函数,拷贝赋值操作符,析构函数,声明创建这些函数是在遵守C++规则的前提下。做雷锋还要遵守规则,嗯。

C++编译器为空类“润物细无声”地做些什么相关推荐

  1. C++中的空类,编译器默认可以产生哪些成员函数

    C++中创建一个空类: class Empty {}; 默认会生成4个函数,其函数的原型如下: public: Empty() { ... } Empty(const Empty& rhs) ...

  2. 【C++】 为什么C++空类占一个字节

    00. 目录 00. 目录 01. 测试程序和结果分析 02. 单继承空白基类最优化问题 03. 多继承空白基类最优化问题 01. 测试程序和结果分析 测试程序如下: #include <ios ...

  3. c++空类实例大小不是0原因

    初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我 ...

  4. C++空类中的默认函数

    参加面试的时候,面试官问到这个问题,我的回答:默认构造函数.默认析构函数.默认拷贝构造函数.默认赋值函数.现在回想起来感觉不对,就google,揭示一下这个看似简单的问题: 一个空的class在C++ ...

  5. C++空类的默认成员函数总结

    C++空类的默认成员函数总结 做IT就要做精英,至少4000/月吧? JAVAV工程师权威认证 [上海央邦]学一送一,超值![安博亚威]CCIE考试通过率第一! 定向委培RHCA,通过考试年薪10W ...

  6. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  7. 空类,虚函数类,虚继承类的空间大小

    //此代码在32位win下运行成功 #include<iostream> using namespace std; class A//A是空类,编译器会用一个char类型标记这个类,大小为 ...

  8. 深拷贝与浅拷贝、空类与空数组

    一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: ...

  9. C++中的空类与空结构体大小

    今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { };int main() {st ...

  10. C++空类和string类

    1. 空类 1.1 空类默认哪六个成员函数. 1 class Empty 2 { 3 public: 4 Empty(); //缺省构造函数 Empty e; 5 Empty( const Empty ...

最新文章

  1. graphpad做折线图坐标轴数字_pandas做数据可视化具体操作,快来看看吧
  2. excel去掉一行文字中的逗号合并在一起_Python使用pandas库五行代码合并excel
  3. 百度编辑器修改,不让它自动替换html标签
  4. Angular双向数据绑定原理
  5. 百度地图API地理位置和坐标转换
  6. MVC中返回Json的几种声明方式
  7. 安卓系统开机过程中logo和动画
  8. python中while的用法_Python—while循环,内涵五种九九乘法表
  9. 「手把手带你学算法」本周小结!(动态规划系列七)
  10. TCP and UDP
  11. (转)Qt添加windows开机自启动
  12. sql查询各科成绩前三名----详述过程,思路清晰不烧脑
  13. OpenTCS打造移动机器人交通管制系统(四)
  14. A - 娜娜梦游仙境系列——诡异的钢琴
  15. 图片公式提取至文档word
  16. python算积分蒙特卡罗_蒙特卡罗计算积分
  17. 魁拔妖侠传 之 浮云骑士语录
  18. 公司内部计算机网络培训,企业内部培训常用的方法
  19. MOVICS系列教程(三) RUN Module
  20. 各大网站 http server分析

热门文章

  1. js常用插件(十二)之手写签名jsignature.js
  2. ruby 发送html邮件,在Ruby中利用Net::SMTP类发送电子邮件的教程
  3. 【转】使用URL SCHEME启动天猫客户端并跳转到某个商品页面的方法
  4. 2023-02-24 mysql/innodb-聚合-临时表避免OOM-使用磁盘文件-分析
  5. python爬虫多线程实战:爬取美桌1080p壁纸图片
  6. 趣图:一个同事的桌面
  7. java+springmvc+vues 基于ssm的自驾游网站系统#毕业设计
  8. win10系统CH340模块连接上电脑后端口显示叹号而无法使用
  9. 安全多方计算之SPDZ开源库语法详解——Sint
  10. 高楼扔鸡蛋问题一种比较简单的解法(C++)