CH9 对象和类

1.一个类是指一个模板、蓝图或约定,定义了对象具有什么样的数据域和函数。

   一个类具有唯一的身份、状态和行为。

  状态(state):一个类的状态用数据域以及它们的当前值来表示。

  行为(behavior):一个类的行为由一组函数定义。

  相同类型的对象用一个通用的类来定义。

2.实例

  一个对象就是类的一个实例。创建一个实例称为实例化(instantiation)。术语中的“对象”和“实例”通常是可以相互交换的。

3.在一个C++类中,用变量定义数据域,用函数定义行为。

4.UML图(Unifined Modeling Language,统一建模语言)/简称类图

  + 表示公有域public(public表示所有的数据域、构造函数和普通成员函数都可以通过类对象来访问)

  - 表示私有域private

5.定义类和创建对象

  

class Circle

{public:
     double radius;  //数据域
  Circle()           //构造函数(初始化对象)
   {  radius=1;}
  Circle(double newRadius)
   {  radius=newRadius;}
  double getArea()     //函数
   {return radius*radius*3.14159;}
};
★静态生成对象,不需要用new;动态生成对象,需要用new。

★Circle 类(定义),不要忘记在末尾加分号;

(1)创建对象:

Circle circle1(1.0);
Circle circle2(25);
Circle circle3(125);
(2)访问数据域:circle1.radius

(3)调用函数:circle1.getArea()
6.构造函数

    构造函数的名字必须与类名相同

    构造函数没有返回类型--即便void也不可以;

    在创建对象时,构造函数被调用,它的作用就是初始化对象

    与一般函数相同,构造函数可以被重载(即可以有多个同名的构造函数,但它们的函数签名不同)

构造函数:
Circle()
{ radius=1;}
Circle(double newRadius)
{ radius=newRadius;}

7.数据域的初始化

(1)数据域不能在声明的时候初始化

   一个变量(无论局部还是全局变量)可以在一条语句中完成声明和初始化,但作为一个类成员,数据域是不能在声明的时候进行初始化的。

   数据域的初始化靠构造函数。

(2)在构造函数中,可以使用初始化列表来初始化数据域:

Circle::Circle()
   :radius(1)
{
}

等价于:

Circle::Circle()
{
   radius=1;
}
8.创建和使用对象

  (1)创建对象时会调用构造函数

           使用无参构造函数创建一个对象:ClassName objectName;

           使用有参构造函数创建一个对象:ClassName objectName(argument);

            eg:Circle Clrcle1;

                  Circle Circle2(5.5);

  (2)使用点运算符(.)即:对象成员访问运算符(object member access operator),来访问对象的数据及调用对象的函数。

     数据域radius被称为实例成员变量(instance member variable)或实例变量(instance variable)

     函数getArea被称为实例成员函数(instance member function)或实例函数(instance function)

   ★定义一个类时,首字母大写(C++库中类名都是小写形式,这样易于区分两种不同的类)

  (3)一个类就是一个数据类型;

            可以使用赋值运算符=来进行对象间内容的复制;eg:     circle1=circle2;

            数据是储存在对象中的,但函数不是,因为函数是这个类所有对象共享的,编译器仅仅创建一份拷贝就可以了。

9.创建匿名对象(anonymous object)

    我们可能需要创建一个对象,却只使用一次。对于这种情况,无须为对象命名

    使用无参构造函数创建一个匿名对象: ClassName()

    使用有参构造函数创建一个匿名对象: ClassName(argument)

    

cout<<"Area is"<<Circle().getArea()<<endl;
cout<<"Area is"<<Circle(5).getArea()<<endl;

10.c++允许将类的定义和实现分离。类定义简单列出所有的数据域、构造函数原型和函数原型,类实现给出构造函数和成员函数的实现,两者可以置于两个分离的文件中。

     类定义的扩展名为.h;

     类实现的扩展名为.cpp

★符号::称为二元作用域解析运算符(binary scope resolution operator),指明了类成员的作用范围。

★每个构造函数和函数之前的Circle::告知编译器这些函数是定义在Circle类中的。

Circle.h
class Circle{
  public:
          double radius;
  Circle();
  Circle(double);
  double getArea();
};
Circle.cpp
Circle::Circle()
{radius=1;}
Circle::Circle(double newRadius)
{  radius=newRadius;}
double Circle::getArea()
{return radius*radius*3.14159;}

11.避免多次包含

      #ifndef CIRCLE_H               //判断是否已经定义

      #define CIRCLE_H



      #endif                                 //指出头文件结束

12.类中的内联函数(不鼓励用内联函数,因为是用空间换取时间的手段)

     如果一个函数是在类定义内实现的,那么它自动成为一个内联函数;

class A
{
   public:
             A()
                {
                 //Do something
                }
              double fl()
                {
                   //Return a number
                  }
             double f2();
};

 double f2();//函数仅仅定义没有实现

    为类定义为内联函数----在类的实现文件中指明成员函数是内联函数。

inline double A::f2()
{
   //Return a number
}

13.数据域封装(data field encasulation)

       private关键字,将数据域声明为私有的数据域。

      为了使私有数据域可以被访问,可定义一个get函数返回数据域的值;

      为了使私有数据域可被修改,可提供一个set函数为数据域设置新值。

     get函数:

     returnType getPropertyName()

     返回类型是bool类型的get函数:

     bool isPropertyName()

    set函数:

    void setPropertyName(dataType propertyValue )

#ifndef CIRCLE_H
#define CIRCLE_H
class Circle
{
  public:
        Circle();
        Circle(double);
        double getArea();
        double getRadius();
        void setRadius(double);
 private:
        double radius;
};
#endif
数据域是私有的,私有数据只能在定义它的类的内部访问。

int main()
{  
   Circle circle1;
   Circle circle2(5.0);
   cout<<"The area of the circle of radius"<<circle1.getRadius()<<"is"<<circle1.getArea()<<endl;
    circle2.setRadius(100);
cout<<"The area of the circle of radius"<<circle2.getRadius()<<"is"<<circle2.getArea()<<endl;

 14.类抽象(class abstraction)

      类抽象就是将类的实现和它的使用分离开来。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值