首页
社区
课程
招聘
[原创]逆向C++之封装性 - 类和对象
发表于: 2009-2-2 14:54 11618

[原创]逆向C++之封装性 - 类和对象

2009-2-2 14:54
11618

【文章标题】: 逆向C++之封装性 - 类和对象
【文章作者】: kanghtta
【作者邮箱】: kanghtta@hotmail.com
【作者主页】: kanghtta.cublog.cn
【下载地址】: 自己搜索下载
--------------------------------------------------------------------------------
【详细过程】
     大家好,由于前段时间写了一部分逆向C++的内容,后来又因为考研和放假耽误了一段时间,希望大家谅解;好了,开始正题;
  我们知道,面向对象的设计思想,近来成长的非常快;而c++是从C语言发展而来的;
  
  这一节我们开始接触面向对象的第一个特性,封装性;首先,我们来回顾一下基本的概念;
  
  学过java或者是任何一门面向对象语言的人对类和对象也许都不算陌生,而面向对象中其实应用最广泛的,莫过于继承
  和多态性,而封装性,是学习后面的基础,我从高中开始,在学习上的座右铭: 基劳楼自高,水到渠自成;
  好了废话太多,我们开始:
  
  1:类和对象:
     我们知道,类是对数据类型高度抽象的具体表现,它是一种类型,这种类型的特点就是将所描述的客观事物的不同类型
  的数据和对它们的操作封装成为一个集合体;在数据结构种,类也称为数据类型;
     
     数据类型:在高级语言编写的程序中,每个变量,常量和表达式都必须有一个它所属的的确定的数据类型,类型明显
  或隐含地规定了在程序执行期间变量或表达式所有可能取值的范围,以及在这些值上允许的操作。因此,数据类型,是
  一个值的集合和定义在这个集合上一组操作的总称。
  
    类的分类: 类在语言中有原子类型也称为基本类型,如 int ,float,double,等常用的数据类型,这些类型在任何一门
  语言中都是存在的,从内存的角度来看,它们的长度不同,而且表示方式也不同,int一般是整数,在计算机中一般用补码
  表示,而float,double是浮点数表示,关于定点数和浮点数的的数制表述,大家请参考计算机组成原理;
      而我们在这一章中主要做的就是用上面的基本数据类型来描述我们现实生活中需要处理的对象; 这在以前被称为
  结构类型;由struct定义,有一定c++基础的人都知道,struct和class的作用是一样的,它们都可以作为定义类的关键字,
  不同的是,它们定义的类,默认的访问权限不同; struct 默认为public,而class默认为private;至于什么是访问权限,
  我会在下面解释;
  
  什么是对象?
      对象是类的实例化,比如人类就是一个抽象的类,而你或者我就是人类的一个实例化;类和对象的关系,
  是抽象和具体的关系;
  
  2;类的定义格式
    类的定义格式,分为两部分;--- 说明部分和实现部分;
  
  a:)说明部分用类说明该类中的若干成员,包括被说明的数据成员和成员函数;成员函数也称为方法,用来对数据成员进行
  操作,数据成员的说明包含数据成员的名字和类型;成员函数可以在类体内只有说明,也可以在类体内对它定义(内联和外联);
  
  b:)实现部分,主要用来对类体类只有说明而没有定义的函数进行定义; 而如果一个类的所有成员函数都定义在类体内,
  该类就没有实现部分了;
  
  简单点来说: 程序员在创建类的时候就创建了一种类型,提供了具有所定义的类的属性空间;对于复杂的对象,类能很方便
  地在一个容器中把所需要用来描述对象的细节包装起来,这就是数据封装的意义;
  
  下面我们来看一个例子:
  
  我们一般将类定义在头文件中如下:
  

#include<iostream>
using namespace std;

class	CDate
{
public:
	void	SetDate(int y,int m,int d);
	bool	IsLeapYear();
	void	Print();
private:

	int		year,
			month,
			day;
};

void	CDate::SetDate(int y,int m,int d)
{
	year = y;
	month = m;
	day	 = d;
}

bool	CDate::IsLeapYear()
{
	return(year%4 == 0 && year % 100 !=0)||(year%400 == 0);
}

void	CDate::Print()
{
	cout<<year<<','<<month<<','<<day<<endl;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发
学习
为啥不用IDA分析啊?
2009-2-2 19:08
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了。不会使用IDA,用是发个IDA的分析上来就好了,当做学习IDA的实例课。嘻嘻。不过楼主能说明下,C++的类这些东西与C语言的函数指针之类的之间的对应分析就更完美了。
2009-4-17 19:19
0
雪    币: 270
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
用od边调试边看实时数据不是更好?  感谢楼主
2010-5-3 15:36
0
雪    币: 104
活跃值: (11)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
好帖,顶...
还没怎么接触过C++。
哎...
2010-5-10 17:19
0
游客
登录 | 注册 方可回帖
返回
//