C++编译器为空类“润物细无声”地做些什么
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++编译器为空类“润物细无声”地做些什么相关推荐
- C++中的空类,编译器默认可以产生哪些成员函数
C++中创建一个空类: class Empty {}; 默认会生成4个函数,其函数的原型如下: public: Empty() { ... } Empty(const Empty& rhs) ...
- 【C++】 为什么C++空类占一个字节
00. 目录 00. 目录 01. 测试程序和结果分析 02. 单继承空白基类最优化问题 03. 多继承空白基类最优化问题 01. 测试程序和结果分析 测试程序如下: #include <ios ...
- c++空类实例大小不是0原因
初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我 ...
- C++空类中的默认函数
参加面试的时候,面试官问到这个问题,我的回答:默认构造函数.默认析构函数.默认拷贝构造函数.默认赋值函数.现在回想起来感觉不对,就google,揭示一下这个看似简单的问题: 一个空的class在C++ ...
- C++空类的默认成员函数总结
C++空类的默认成员函数总结 做IT就要做精英,至少4000/月吧? JAVAV工程师权威认证 [上海央邦]学一送一,超值![安博亚威]CCIE考试通过率第一! 定向委培RHCA,通过考试年薪10W ...
- C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...
- 空类,虚函数类,虚继承类的空间大小
//此代码在32位win下运行成功 #include<iostream> using namespace std; class A//A是空类,编译器会用一个char类型标记这个类,大小为 ...
- 深拷贝与浅拷贝、空类与空数组
一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: ...
- C++中的空类与空结构体大小
今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { };int main() {st ...
- C++空类和string类
1. 空类 1.1 空类默认哪六个成员函数. 1 class Empty 2 { 3 public: 4 Empty(); //缺省构造函数 Empty e; 5 Empty( const Empty ...
最新文章
- graphpad做折线图坐标轴数字_pandas做数据可视化具体操作,快来看看吧
- excel去掉一行文字中的逗号合并在一起_Python使用pandas库五行代码合并excel
- 百度编辑器修改,不让它自动替换html标签
- Angular双向数据绑定原理
- 百度地图API地理位置和坐标转换
- MVC中返回Json的几种声明方式
- 安卓系统开机过程中logo和动画
- python中while的用法_Python—while循环,内涵五种九九乘法表
- 「手把手带你学算法」本周小结!(动态规划系列七)
- TCP and UDP
- (转)Qt添加windows开机自启动
- sql查询各科成绩前三名----详述过程,思路清晰不烧脑
- OpenTCS打造移动机器人交通管制系统(四)
- A - 娜娜梦游仙境系列——诡异的钢琴
- 图片公式提取至文档word
- python算积分蒙特卡罗_蒙特卡罗计算积分
- 魁拔妖侠传 之 浮云骑士语录
- 公司内部计算机网络培训,企业内部培训常用的方法
- MOVICS系列教程(三) RUN Module
- 各大网站 http server分析
热门文章
- js常用插件(十二)之手写签名jsignature.js
- ruby 发送html邮件,在Ruby中利用Net::SMTP类发送电子邮件的教程
- 【转】使用URL SCHEME启动天猫客户端并跳转到某个商品页面的方法
- 2023-02-24 mysql/innodb-聚合-临时表避免OOM-使用磁盘文件-分析
- python爬虫多线程实战:爬取美桌1080p壁纸图片
- 趣图:一个同事的桌面
- java+springmvc+vues 基于ssm的自驾游网站系统#毕业设计
- win10系统CH340模块连接上电脑后端口显示叹号而无法使用
- 安全多方计算之SPDZ开源库语法详解——Sint
- 高楼扔鸡蛋问题一种比较简单的解法(C++)