正文

[C++]初步掌握类和对象阶段一2006-07-12 22:48:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/fengfei/16560.html

分享到:

初步掌握类和对象分三阶段来讲解:

             第一阶段讲解:定义类,访问类数据成员和方法,在栈或堆上创建对象。

             第二阶段讲解:类的构造函数, 析构函数。

             第三阶段讲解:类的复制构造函数,赋值操作符。

之所以分为三个阶段来讲解是因为讲解的东西比较多和细,特别是第二阶段和第三阶段有很多细小的东西需要分析,不会一步概括。让你明白为什么会这样。。 口水话讲完。呵呵。 进入正题。

              如果你对栈或堆没有初步的认识,可以看[C++]栈和堆原理介绍

              首先让我们来看下类是怎么定义的:

               class 类名                                                    

               { 

                         访问控制符:

                                       成员变量;

                         访问控制符: 

                                       构造函数;(可以不写)

                                       成员方法; 

                                       析构函数;(可以不写)  

                 }  

                定义一个类: class TestClass                    

                         {

                                private:

                                      int x;

                                public:

                                      TestClass( ){ 函数体 };          // 构造函数

                                       void setX( int x ){ 函数体 };  // 成员方法

                                        ~TestClass( ){ 函数体 };        //析构函数

                          }                                

                 访问控制有三种:private(私有), protected(保护), public(公有).. 

                 private:既只有类里面的成员方法可以调用,而在子类,在类外都不能调用。

                 protected:既可以被类里面的成员方法调用,也可以被子类调用,不能在类外调用。

                 public:可以在类里面的成员方法调用,也可以被子类和在类外被调用(一般数据成员最好不要使用此类访问控制符)。

                 构造函数:用于初始化对象数据变量,函数名必须与类名相同,且无返回类型,如果不写则系统会自定义一个默认构造函数。 将在第二阶段详细介绍。

                 析构函数:用于释放对象占用的堆内存空间。函数名必须为“~类名”,无返回值,如果不写则系统会自定义一个默认析构函数。  将在第二阶段详细介绍。

                 成员方法定义:一般类定义只是指定了方法的原型,并没有定义函数体。通常类定义会放在一个头文件中,而方法定义则放在一个源文件中,这个源文件要通过include宏包含该头文件, 类定义如下:

   // TestClass.h  头文件                                          

      class TestClass                                                   

     {                                                                            

               private:                                                        

                       int x; 

               public: 

                      TestClass( );  

                      int getX( );  

                      ~TestClass( ); 

     }  

          // TestClass.cpp  源文件        

          #include "TestClass.h"    // 包含头文件

          TestClass::TestClass( ) // 定义构造函数

           {

                        x = 10;    // 初始化数据

           }

           void TestClass::setX( int x )   // 定义方法

           {

                        this.x = x;

           }

          TestClass::~TestClass( )  // 定义析构函

           {           

           // 用delete来释放对象占用的堆内存空间 

           }                        

                                                                                                                

            this指针:每个成员方法的调用都会传递调用该方法的对象的一个指针,将起作为“隐藏”的第一个参数,名为this.可以使用这个指针来访问成员变量或调用成员方法。有时这个指针还有助于消除名字的歧义。如:

void TestClass::setX( int x )                                          

{                                                                                     

       x = x;    // 成员变量和函数参数名字歧义                      

}                                                                                      

void TestClass::setX( int x )

{

           this->x = x;   // this.x 表示成员变量

}

            创建类对象:有2种创建和使用对象的方法;在栈上创建和在堆上创建。

            在栈上创建:

            TestClass myClass;

            myClass.setX( 20 );

           可以像声明简单变量一样创建对象,只不过这里的变量类型是类名。myClass.setX(10)中的“.”称为“点”操作符,利用点操作符可以调用对象上的方法和共有的成员变量。

           在堆上创建:

           TestClass *myClass = new TestClass( );

           myClass->setX( 20 );

           (*myClass).setX( 20 );

           delete myClass;

           用new在堆上创建一个对象,可以通过“箭头”操作符(->)来调用方法或共有变量。箭头结合了2个作用,一个是解除引用“*”,一个点操作符“.”。也可以使用这2个操作符(*和.)((*myClass).setX( 20 );),但是这样做的风格不好。    在堆上创建创建的对象就必须通过调用delete来释放堆上为对象分配的内存空间(delete myClass;)。

         第一阶段就讲到这里,由于个人知识有限,有什么错误的地方还请高手指出来。过几天发第二阶段讲解。。

阅读(4008) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册