Inside The C++ Object 补遗

  终于把该死的direcshow给了结了,不管它结果怎么样,总算结束了,做这种东西真是痛苦。好了,五一到了,终于可以做些想做的事情了。上次考NIT-Pro,C++考的不是很满意,原来很多学过的东西都忘了,是缺少实践的原因。现在要好好补一下了,省得前功尽弃。

 第一章 关于对象(加了一些自己的随笔,起记录用)
1.几个基本概念(网上看到有面试官奚落毕业生这个东西都不知道,其实非不知也,不知何云也):
     面向对象程序设计--程序围绕被操作的数据来设计,而不是操作本身。以类为构造程序的基本单位,具有封装,数据抽象,继承,多态性等特点。
     抽象数据类型(ADT)--一组相似类的抽象描述,一个类是ADT的具体实现。
2.重载[]运算符(通常要写两个):
   作为左值:   
type& operator[]( int index )
    {
        assert( index < dim && index >= 0 );
        return _coords[ index ];
    }
   作为右值:
    type operator[]( int index ) const
    {
        assert( index < dim && index >= 0 );
        return _coords[ index ];
    }
3.template的实体参数和函数形参的不同在于它的值不可改变,还有,能用来定义数组,动态决定数组元素的个数;
4.所谓的inline成员函数:加了inline前缀的成员函数,其定义也必须放在头文件里。
5.加上封装后的布局成本:主要的额外负担是由virtual引起。
6.简单对象模型:一个object是一系列slot,每个slot指向一个member,包括data member和function member;
   表格驱动模型:object有两个指针,一个指向data member table,一个指向function member table;
   c++对象模型 :Nostatic data number,vptr在class object内;
                               static data number,function members都放在object外,不占object的空间。
                               --当然,object内还可能有其他东西,比如继承的成本;
                               --那么,object与member函数的关联是通过传送隐含的this指针来实现的。(function语意学)
7.虚拟继承:base class不管在继承链中被派生多少次,永远在派生内中只存在它的一个实体。(slot指针实现)
8.指针的类型:“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。转型是一种编译器命令,
         大部分情况下,它并不改变指针所含的地址,只是影响“被指出之内存的大小和内容”。
--基类指针的涵盖地址范围要小于派生类指针,所以不能用基类指针来调用派生类中新增的函数,即使是该指针指向的是一个派生类对象。
--指针类型信息的封装并不是维护与指针当中,而是维护在link当中,此link存在与vptr和virtual table之间。
 
第二章 构造函数语意学
2.1 编译器必须为未声明constructor的class合成一个default constructor:
  1.  "带有Default Constructor"的Member Class object
  2.  "带有Default Constructor"的base Class
  3.  "带有virtual function"的 Class(因为vptr,vtbl必须在constructor中被编译器产生出来)
  4.  有virtual base class(_vbcX--派生类中指向virtual base class X的指针必须初始化)
注意:trivial default constructors编译器其实并没有合成出来;编译器合成出来的default
Constructors 不会设定class内的data members的初始值;合成时,先插入基类的default
Constructor 再插入其内部的member class object的default constructor
 
2.2 Copy Constructor的建构操作
1.发生的三种情况:
  1. 以一个object的内容作为另一个class object的初值,如:classname xx=x_class;
  2. Class object作为形参;
  3. Class object作为返回值。
2.bitwise copy semantics:位逐次拷贝,如果一个class展现出bitwise copy semantics,那么它的copy constructor就是trivial,如果其本身没有提供一个显示copy constructor,用一个object给另一个相同类的object赋值时就会采用逐个成员变量浅复制的方法,编译器不会再合成copy constructor。
3.何时一个class不会展现“bitwise copy semantics”:
  1. 当class内含一个member object而后者的class声明有一个notrivial copy constructor时;
  2. 当class继承自一个base class而后者存在有一个notrivial copy constructor时;
  3. 当class声明了一个或多个virtual functions时;
  4. 当class有virtual base class时。
4.编译器合成copy constructor 的责职:
  1. 重新设定virtual table的指针(主要是用一个派生类对象给基类对象初始化时)
     --注意是初始化,而不是赋值。赋值操作是不改变vptr的。
  1. 处理virtual base classsubobject
 
2.3 程序转化语意学
  1. 通过相同Class object的初始化操作转化包含两个阶段:
    1. 重写每一个定义,其中的初始化操作会被剥除;
    2. class的copy constructor调用。
  2. 参数的初始化(borland c++采用的"拷贝建构"的方式):
    1. 产生一个暂时对象,调用copy constructor初始化;
    2. 将函数转化为引用形参形式。
  3. 返回值的初始化X bar():
    1.  加上一个额外参数,类型是class object的一个reference,用来存放“拷贝建构”而得得返回值;
    2.  在return指令之前安插一个copy constructor调用,将欲传回的object的内容当作上一个新增参数的初值。
  4.  NRV优化:消除用来传值的传回object,先调用新增引用参数的default constructor初始化,然后直接处理它。
 
2.4成员们的初始化队伍
1.必须使用member initialization list的四种情况:
  1. 当初始化一个reference member时;
  2. 当初始化一个const member时;
  3. 当调用一个base class的constructor,而它拥有一组参数时;
  4. 当调用一个member class的constructor,而它拥有一组参数时;
2.list中的项目次序是由class中的members声明次序决定,不是有initialization list中的排列次序决定的。先基类,再成员。
3.不要调用class object的一个成员函数在初始化列表中初始化一个参数,而应在constructor函数体内。因为这时,this指针已经建构妥当。
 
第三章 data语意学
1.staic成员函数不接受隐含的this指针,故无法访问自己类的非静态成员。
2.virtual base class中一般没有成员变量。
3.static data members存放在data segment中。取一个static data member的地址,将得到一个指向其数据类型的指针,如 class{public:static const int ch=20;};会得到const int*;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值