Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104612
  • 博文数量: 25
  • 博客积分: 514
  • 博客等级: 下士
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-07 01:22
个人简介

漂泊海外的游子

文章分类

全部博文(25)

文章存档

2015年(2)

2013年(1)

2012年(22)

分类: C/C++

2012-02-21 01:07:44

类,才是与C一个很重要的区别。
类,就是将一些东西放在一起,这样的说的话有点像结构。可是类不仅如此,放在的一起的东西不仅有数据成员,也有函数。对了,还有函数。也就是说类是一个独立体,它可以完成自己数据的加工。不像结构只有数据。

当然类也是一种数据结构类型,也可以像正常的数据类型一样制造出很多对象。这些对象具有类的一切成员。

1. 类的声明
关键是class
例如
  1. class class_name {
  2. int x,y;
  3. public:
  4.  void set_values (int,int);
  5.   int area (void);
  6. }object_name;
大家注意到有个public:,它的意思是说,下面的成员是公共的,谁都可以访问。

当然还有
private:  私有的,自己的,自己和自己的朋友可以访问
protect:自己,自己的朋友和自己的子女(派生类)可以访问

由类产生的对象,如何访问自己的成员?
结构的对象怎么访问,它就怎么访问。其实在C++里,struct,union也是类,和class声明的类不一样的地方在于成员的默认权限。

class默认成员是私有的,struct和union是公共的;同时,union又和它们有区别的:它一次只能有一个成员。

说回来,访问是用".",object_name.member_name;

再说说函数
一般类里的函数只声明,定义放在外面。当然函数定义如果很短,那就不必了。
在外面的定义的规则是什么?
用两个冒号,例如
void object_name::set_value (int a, int b) { ...}

说了这么多,搞了类有什么好处呢?
类就是做个类型,一个数据类型,就可以想常规的类型一样,可以搞出很多对象。而且这些对象成员是一样,就像复制一样,搞了这么多,就可以分别用在不同地方(输入的数据不一样)。

2. 构造函数和析构函数
这是干什么的?一个类,有数据成员,那这些数据成员总要赋值吧,不放数据怎么玩?这就由构造函数完成。像刚刚的例子就没有构造函数,这样很不安全,容易错啊。构造函数把这个做了,那析构函数干什么?跟构造函数反着干。构造函数搞了这么多,很占内存的,所以一旦对象被销毁,析构函数会被自动调用。释放内存。

那在类中怎么声明这两个函数呢?
两个函数的名字都和类的名字一样,只不过析构函数的名字前再加个“~”

对上面的例子可以进行改进。
  1. #include <iostream>
  2. using namespace std;

  3. class Crectangle {
  4.    int width, height;
  5.    public:
  6.    Crectangle (int,int);                                //构造函数
  7.    ~Crectangle ();                                     //析构函数
  8.    int area () {return (width*height);};
  9.    
  10. };

  11. Crectangle::Crectangle (int a, int b) {             //构造函数定义
  12.    width = new int;                                 //分配int型内存空间
  13.    height = new int;
  14.    *height = b;                                  //将b放进内存
  15.    *width = a;
  16. }

  17. Crectangle::~Crectangle () {                   //析构函数定义
  18.   delete width;                                //释放内存
  19.   delete height;
  20. }

  21. int main () {

  22.   Crectangle rect (3, 4), rectb (5, 6);
  23.   cout<<"rect area: "<<rect.area ()<<endl;
  24.   cout<<"rect area: "<<rectb.area ()<<endl;
  25.   
  26.   return 0;
  27. }
提醒下,有个默认的构造函数
就是说,你不做个构造函数,也会有个默认的。但是你一旦声明了一个,它就失效了。
还有就是这些由类生成的对象,我们可以新生成一个对象,然后将以前的对象复制给它。
Crectangle a (3,4);
Crectangle b(a);           //这是可以的,将构造函数和数据复制给它了。

3. 过载
这个以前说过吧,不过说的是函数。
这次说的也是函数,不过是构造函数。只有它是函数,也可以过过载嘛。
也就是说,我可以定义很多个构造函数。
这不多说了,以前函数说了,没有什么区别。

4. 指向类的指针
说来说去,还是这么东西。以前说过结构,同样也能被指针指啊。
没有区别,更何况结构本来也是个类。
体会就是:只有是个数据类型,你就能被指针指来指去。

今天就到这,明天继续说类,谁叫类这么多花样呢。




阅读(1041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~