c++ 面向对象 总结

    xiaoxiao2021-04-14  32

    1、初始化 定义时,若创建全局对象,则以全0位的模式表示对象。若创建局部对象,则以随机值表示对象。 例如:

    #include"point.h" #include<iostream> using namespace std; Point t; int main(){ Point s; cout<<s<<t; }

    程序结果:

    (256,1) (0,0)

    可见,这种方式定义的对象,并没有根据实际问题所提要求赋给一个有意义的初值。使得对象的意义不甚明了。

    2、构造函数 作为对象的构造函数,其根本的使用就是创建对象实体,如果创建失败,比如:内存空间短缺,将会引起系统异常,这时候真要论及处理,就该让程序捕捉该异常。

    类定义中若无构造函数,也可以用对象定义语句创建对象,类机制总是为无构造函数的类默认地建立一个无参构造函数,他除了分配对象的实体空间外,其他什么都不做。实际编程对构造函数重载时,一般使用默认参数,这样的话无参构造函数的调用也能顺利通过。

    构造函数也是函数,可以重载和设置默认参数。

    3、一次性对象 创建时不给出对象名,直接以类名调用构造函数,则产生一个无名对象。无名对象经常在参数传递时用到。 如:

    cout<<Date(2002,12,23); //Date(2003,12,23)是一个对象,该对象做了<< 操作之后就烟消云散了,所以这种对象一般用在创建后不需要反复使用的场合。

    4、成员初始化

    Date:Date(int y,int m,int d){ year=y; month=m; day=d; } 或者 Date:Date(int y,int m,int d):year(y),month(m),day(d){ }

    5、局部对象 创建的对象顺序是根据变量在程序中运行时定义对象的顺序。静态对象只创建一次。

    6、全局对象 和全局变量一样,所有全局对象在主函数mian 启动之前,全部已被析构。调试总是从mian函数开始的,因此在捕捉错误之前,错误可能已经产生。

    一旦main函数开始启动,则运行顺序是可控的,但全局对象并不依赖与从main函数之后的运行顺序,他早在main函数运行之前就已经创建完毕了。所以,全局对象的创建顺序在标准c++中没有规定,也无法规定,一切视编辑器的内在特性而定。

    7、成员对象 成员对象以其在类中声明的顺序构造。 如:

    class C{ A a; B b; public: C(int x,int y):b(x),a(y){ } }; int main(){ C c(15,9); }

    输出结果:

    A:9->B:15->C

    8、构造位置 全局数据区: 全局对象、常对象、静态对象都放在全局数据区。要让对象的生命期与运行程序等寿命,只能放全局数据区。

    栈区: 定义的局部对象放在栈区。

    动态内存区(堆区): new 申请的空间都放在堆区。

    9、拷贝构造函数

    Person x("xiaoming"); Person y=x;

    这种创建活动称为拷贝构造。如果对象实体是单纯的对象本体,那对象的拷贝构造与变量的拷贝创建并无两样,但,对象实体若不仅仅是对象本体时,对象的拷贝构造便有了差异。

    默认拷贝构造仅仅拷贝了对象本体。

    10、自定义拷贝函数 自定义拷贝函数是构造函数的重载。 拷贝构造函数的参数必须是类对象的常量引用:

    Person p2(const Person &s);

    11、析构函数 当对象本体与对象实体一致时,拷贝称为浅拷贝;当对象本体与实体不一致时,拷贝称为深拷贝。深拷贝需要做动态分配的工作。动态申请是人为的,与之对应,释放也是人为的。系统不会自动为对象做内存释放工作。

    人为的内存释放工作由析构函数来完成。

    析构函数没有参数,没有重载,函数形式是唯一的。 析构函数在对象的生命期将结束的瞬间,由系统自动调用。因此,析构函数的调用不是通过显示语句表示的。

    11、对象赋值 对象拷贝就是对象赋值。 但默认的赋值操作符只管对象本体的复制,如果对象之间要做深拷贝的话,则必须自定义赋值操作符。 自定义操作符必须注意,原来的对象已经存在,要先将原来的资源释放掉,然后再进行深拷贝式的复制。

    c++规定了关键字this,专门用来表示当前对象的地址。

    转载请注明原文地址: https://ju.6miu.com/read-669614.html

    最新回复(0)