c++ 面向对象 总结

来源:互联网 发布:优品课堂python百度云 编辑:程序博客网 时间:2024/06/03 17:46

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,专门用来表示当前对象的地址。

0 0
原创粉丝点击