现在的位置: 首页 > 综合 > 正文

面向对象(一)

2018年02月16日 ⁄ 综合 ⁄ 共 2371字 ⁄ 字号 评论关闭
对象生灭

面向对象的上一篇笔记是关于类的技术性问题,而这篇笔记则针对的是钱老书中的第九章——对象生灭。探索对象这一类的具体表现的生命周期问题。

//////////////////////////////////////////////////////////////////////////////////////////////////////
1,问题引导
2,关于构造函数
    这个问题钱老书中的叙述值得注意的都是细节,大的概念都是一样的。
2.1 形如Date d;这种形式定义的对象,调用的是默认的构造函数。如果未定义默认构造函数,则创建出的对象就如同int d;一样,全局则为0,局部则为随机量;
2.2 注意一下语法细节:
2.3 一次性对象(无名对象),直接以类名调用构造函数。
3,以下内容较新鲜(仍是关于构造函数的):
1,组合对象构造过程。
2,在构造函数体中是无法完成对常量成员与引用成员的初始化的。这是因为对于一个已经创建的常量,再赋给新值是没有道理的。引用也只能在创建时进行变量实体的对应,对于一个引用来说,之后的赋值语句并不表示再次与变量对应,而是间接操作了引用所对应的变量。
3,那怎么办呢?
使用成员初始化列表。如下所示:
上图中所显示的是:在Student类的构造函数中所使用的成员初始化列表。对于变量id而言,其类型为StudentID,是一个类类型,成员初始化列表会调用该类的构造函数完成对其的初始化;而变量name是string类型,name(n)等价于对成员变量name的初始化name=n;这种形式。换句话说,对于类对象成员或普通变量成员而言,成员初始化列表均能达到对其进行初始化的目的。
如下图所示:
新鲜内容结束☺
4,构造顺序
1,C++规定了构造对象的顺序。
2,局部对象
3,全局对象
特点:在主函数执行之前,全局对象已经构造了。
因为具有此特点:与变量不同,对象的构造必须调用构造函数实现,也就是说,在主函数执行之前,已经有代码执行过了(全局对象所调用的构造函数),这一点需要注意。
导致:不利于程序调试。因为调试总是从main函数开始的,因此在捕捉到错误之前,错误可能已经产生。
解决方案:①先将全局对象作为局部对象来调试;②在构造函数中打印语句。
全局对象最敏感问题——全局对象构造问题
    也就是说,全局对象的创建顺序是由编译器所决定的,不同的编译器有不同的实现,这是程序员所无法预料的。也因此,尽量少使用全局对象,尤其是不要让全局对象之间相互依赖。示例程序见:钱老.308页。
4,成员对象(Member Objects)
    何为成员对象?就是在类中作为成员的对象。而成员对象以其在类中声明的顺序构造。成员初始化列表(构造参数表)也无法改变此顺序。
构造顺序结束☺
5,构造位置
1,全局数据区
        特点:对象的生命期与程序运行期一致。
        包括:全局对象、静态对象、常对象
2,栈区
        函数内部定义的对象构造在此。
3,堆区(动态内存区)
        new申请,delete释放。
        如:vector<int> * pVi = new vector<int>[100]; // 申请
               delete[] pVi; // 释放
4,
看下图:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

以下内容为 拷贝构造函数 与 操作符重载。这两点内容是C++语法的特点。

一、拷贝构造函数
主要总结内容见笔记本中“拷贝构造函数”一文。
附加内容:
1,拷贝构造函数与析构函数是成对出现的。因为析构函数的作用是释放掉数据指针所指向的空间,而存在数据指针所指向的空间的地方,就需要拷贝构造函数来完成创建时的拷贝工作。
2,析构函数是三无产品:
无返回值、无参数、无重载(形式)。
3,摘录书中关于拷贝构造函数格式的说明:

二、操作符重载
    此处所涉及到的重载操作符为赋值符(=)。赋值运算符之所以在这里被着重提出,源于:对于基本数据类型,存在赋值操作,如int i
= 2; int j; j = i;。出于类的完整性,这样的操作对于自定义类型也应该有定义。C++中,提供了一个默认的对于赋值运算符的实现,但是这个实现也只是对于对象成员本体的复制,当本体与实体不一致时,同样面临着 深拷贝 与 浅拷贝 的问题。因此,一般情况下,拷贝构造函数、析构函数、重载的赋值运算符函数都是一起在类中定义的,因为这三个函数都是对于本体与实体不一致这一情况的处理。
    以上所描述的是对赋值操作符进行重载的原因。接下来就介绍一下实现重载赋值操作符的技术。
一图胜千言:
    
New Content:
    C++对类的支持的确很完备。接下来介绍的概念对应于基本数据类型的自动转换。如:int i = 2; double d; d = i;。此时,会发生int类型向double类型的转换。而对于类类型,自动转换的实现需要我们编程实现。
    技术内容如下图所示:

结语:
        这两篇总结可以归纳为一个主题:基本类机制。其所介绍的内容都是最基本的类的定义、对象的创建与析构、对象的拷贝构造和拷贝等内容。截止目前,所介绍的内容只是足够我们建立一个有一定完整性的自定义类,而涉及的特性也只有数据封装和信息隐藏。通过最近的学习我隐约感受到了类机制的强大与C++的复杂。接下来对于面向对象的学习进行到了把一个个孤立的类架构起来,组织其为层次结构这一阶段。
//////////
2014-10-29
【上篇】
【下篇】

抱歉!评论已关闭.