您的位置:首页 > 编程语言 > C语言/C++

c++ 面向对象 总结

2017-04-13 19:50 169 查看
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,专门用来表示当前对象的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 c++ 面向对象