类的构造函数与析构函数

类的构造函数与析构函数

1. 构造函数不能指定返回类型(void也不行)
 作用:初始化对象的数据成员。
 种类:无参构造函数、一般构造函数(重载构造函数)、复制构造函数(拷贝构造函数)、类型转换构造函数、等号运算符重载(不属于构造函数)

2. explicit关键字,只能被应用在构造函数上,通知编译器不要提供隐式转换。

3. 编译器不会为类生成默认构造函数,只有在需要时才会为类生成一个默认构造函数
 1). 一个类有虚函数
 2). 一个类有虚基类
 3). 一个类的基类由默认构造函数
 4). 一个类的成员类有默认构造函数

4. 构造步骤
 1). 按声明顺序构造基类
 2). 设定虚表指针
 3). 按声明顺序构造成员类
 4). 如果用户写有代码,则执行这些代码

 总结:在用户代码执行前,基类成员已构造完毕,虚指针已设定。
 在继承体系中,一个类的构造函数执行时,该类的所有基类已构造完毕,虚指针已设定,所有成员类已构造完毕。但该类的所有子类均未完成构造任务。

5. 编译器不会为类产生析构函数,只有在需要时才会为类生成一个析构函数
 1). 类的基类有析构函数
 2). 类的成员类由析构函数

6. 析构步骤
 1). 设定虚表指针
 2). 执行自己的代码
 3). 按照声明顺序相反顺序析构成员类
 4). 按照生命顺序相反顺序析构基类

7. 例子

 已知:
 class B1{}; class B2{}; class C1{}; class C2{};
 class T: public B1, public B2{
  public:
       C1 c1;
       C2 c2;
 };
 则构造顺序为:B1-->B2-->虚指针设定-->C1-->C2-->T的代码, 可见构造是由上而下的。
 而析构顺序为:虚指针设定-->T的代码-->C2-->C1-->B2-->B1, 可见析构时由下而上的。

8. 虚函数
 在每个类的构造函数中,都会暂时将虚指针指向自己的虚表。

9. 构造函数问题:
 对子类构造,必须先对父类构造,若子类没有显式调用父类构造函数,就会调用父类默认构造函数
 如果一个类没有构造函数,C++编译器自动生成默认构造函数
 然而如果已经书写了构造函数,C++编译器就不会再生成默认构造函数了

10. 关于虚函数。
 首先明白虚函数地址表vtable。这个表格是为了找到函数的真正入口。
 虚函数与普通成员函数的不同:普通函数直接调用地址,找到函数入口;虚函数要先从虚函数表获得函数地址,才能找到函数入口地址。
 从这一点来看,普通函数的效率要高。

11. 访问控制
 private: 只能由该类中的函数、其友元函数访问。不能被任何其它访问,该类的对象也不能访问。
 protect: 可以由该类中的函数、其友元函数、子类中的函数访问,但不能被该类的对象访问。
 public: 可以由该类中的函数、其友元函数、子类中的函数、以及该类的对象访问。

 注:友元指友函数、友类中的成员函数。

    继承之后的访问
 private继承:父类中所有的属性在子类中变为private
 protect继承:父类中的protect和public属性在子类中变为protect,private不变
 public继承:父类中的所有属性不变


思考:深拷贝与浅拷贝、单件模式等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值