类和对象

10.1
面向对象编程简写为OOP,最重要的特性为抽象、封装和数据隐藏、多态、继承和代码的可重用性。
10.2
抽象是通往用户定义类型的捷径,在C++中,用户定义类型指的是实现抽象借口的类设计。
指定基本类型完成了三种工作:决定数据对象需要的内存数量;决定如何解释内存中的位;决定可使用数据对象执行的操作或方法。
类是一种将抽象转化为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。

类是如何定义的???
    类规范是由两部分组成的,一是类声明,以数据成员的方式描述数据部分,以成员函数的形式描述公有接口;二是类方法定义,描述如何实现类成员函数。类声明是一个大的蓝图,类方法则是实现的细节。
要使用某个类,必须了解其公共借口;要编写类,必须创建其公共接口。
C++程序员将接口(类声明)放在头文件中,将实现(类定义方法)放在源文件中。
公有成员函数是程序和对象的私有成员之间的桥梁,防止程序直接访问数据称为数据隐藏。
封装:数据隐藏是一种;公有接口和实现细节分开是一种;
数据隐藏是OOP主要的目标之一,数据项一般放在私有部分,组成类接口的成员函数一般放在公有部分;

类描述看上去很像包含成员函数以及public和private可见性标签的结构声明。结构的默认访问类型是public,只是表示纯粹的数据对象。

实现类成员函数:

为那些由类声明中的原型表示的成员函数提供代码,他们有函数头和函数体,也可以有返回类型和参数,但是它们有两个重要的特征:

一是使用作用域解析运算符::来标识函数所属的类(确定身份),二是类方法可以访问private组件。不同的类可以定义具有相同名字的成员函数。
其定义位于类声明的函数将自动成为内联函数。类声明经常将短小的成员函数作为内联函数 。
C++的目标是使得使用类与使用的基本类型尽可能相同。要创建类对象,可以声明类变量,也可以使用new为类对象分配存储空间,可以将类对象作为函数的参数和返回值,也可以将一个对象赋给另一个对象。

客户就是使用类的程序,类声明和类方法构成了服务器,它是程序可以使用的资源。

     小结:
     1.指定类设计的第一步是提供类声明。公有部分的内容构成了设计的抽象部分。
     2.指定类设计的第二步是实现类成员函数。需要使用作用域解析运算符来指出成员函数属于哪个类。
     3.在类声明和类方法之外使用成员函数名称时,需要使用作用域解析运算符进行限定。
     4.创建对象(即为类的实例),将类名当作类型名即可。
     5.成员函数(方法)可通过类对象进行访问,需要使用成员运算符句点。
10.3 类的构造函数和析构函数
     C++提供了一个特殊的成员函数----类构造函数(名称与类名相同),专门用于构造新对象、初始化将值赋给他们的数据成员。
     构造函数没有返回值,但没有被声明为void类型。位于类声明的公有部分。
     类成员名称是不能作为构造函数的形参名的。1.一般在数据成员前加上m_,2.在数据成员后面加上_;

使用构造函数:
1.显式的调用构造函数:Stock food = Stock("wang zhiwei",250,1.25);
2.隐式的调用构造函数:Stock food("wang zhiwei",250,1.25);
3.使用new的方法:Stock *ptr = new Stock("wang zhiwei",250,1.25); 此时对象没有名称,只是通过指针来管理该对象。
4.对象调用方法,构造函数创建对象。

默认构造函数:
1.是在未提供显示初始值时,用来创建对象的构造函数。没有参数,因为声明中不包含值。
2.当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。
3.为类提供了构造函数后,程序员就必须提供默认构造函数。
4.如果要创建对象,而不显式初始化对象,就必须定义一个不接受任何参数的默认构造函数。 例:Stock kate;
默认构造函数有两种形式:
1.给已有构造函数的所有参数提供默认值;Stock(const string &co="error",long n=0,double pr=0);
2.通过函数重载定义一个没有参数的构造函数;Stock();
Stock first;
Stock first = Stock();
Stock *first = new Stock;  //以上三种形式含义相同;

析构函数:
构造函数创建对象,当对象过期时,用析构函数完成清理;
在类名前加上~号;每个类只能有一个析构函数;
没有任何参数和返回类型;即为~Stock();
其定义没有任何操作;Stock::~Stock() {  }
 
就像尽可能将const引用和指向const的指针用作函数形参一样,
只要类方法不改变调用对象,我们就应该将其声明为const成员函数。例:void show() const; 或 void Stock::show() const {...}

this指针:
每个类成员函数只是涉及到一个对象,即调用他的对象,可是有时候涉及到两个对象,在这种情况下需要使用this指针。
所有的类方法都将this指针设置为调用它的对象的地址。不管是数据还是成员函数,指针使用->运算符。
每个成员函数(包括构造函数和析构函数)都有一个this指针,this指针指向调用对象。如果要返回对象,则使用*this。
传递类对象的标准形式是按引用传递;如果不修改调用对象,则为const引用;

对象数组:
当程序创建未被显示初始化的类对象时,总是调用默认构造函数。
可以用构造函数来初始化数组元素,在这种情况下,必须为每个元素调用构造函数。
Stock stock[3]=
{
   Stock("aaaa",12,30.0),
   Stock("bbbb",21,2.0),
    Stock("cccc",14,5.1),
}; -----------类似于结构体数组
用括号括起的,逗号分隔的值列表; 
如果类包含多个构造函数,就可以为不同的元素提供不同的构造函数:
Stock stock[4]=
{
   Stock("aaaa",2,3.0);
   Stock();
   Stock("bbbb",2,6.0);
}
初始化对象数组的方案是:首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容
复制到相应的元素中,因此,要想创建类对象数组,则这个类必须有默认构造函数。
//如果类对象初始化为const或者指向对象的指针为const,那么被调用的成员函数必须为const成员函数!!!
//如果类对象没有初始化为const或者指向对象的指针不为const,那么被调用的成员函数可以不是const成员函数!!!

类作用域:
可以在全局变量所属文件的任何地方使用它,而局部变量只能在其所属的代码块使用。
函数名称可以是全局的,但不可以是局部的!!!
可以在不同类中使用相同的类成员名而不会引起冲突。
类作用域意味着不能从外部直接访问类的成员,要想访问公有成员函数,必须提供对象;
使用类成员名时,必须根据上下文使用直接成员运算符(.),间接成员运算符(->)或作用域解析运算符(::)。
1.作用域为类的常量
第一种方式是在类中声明一个枚举。在类声明中声明的枚举的作用域为整个类,用枚举为整型常量提供作用域为整个类的符号名称。
2.使用关键字------static
     例: class Bakery
     {
      private:
                 static const int Months = 12; 
 .....
      }
  //这将创建一个Months常量,该常量与其他静态变量存储在一块,而不是存储在对象中。
抽象数据类型-----abstract data type,ADT
ADT以通用的形式描述数据类型,而没有引进语言或实现细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值