第六章:类和对象

类是一种将抽象转换为用户定义类型的c++工具,它将数据表示和操纵数据的方法组合成一个简洁的包

c++是对具有相同属性和行为的一组对象的抽象与统一描述。是用户自定义的数据类型

格式:类的最后一定加“;”

   各成员函数的实现;

class  类名

{

   public:

           公有数据成员和成员函数;

   protected:

           保护数据成员和成员函数;                  类成员可以是数据类型,也可以是函数;

   private:

           私有数据成员和成员函数;

};

由于隐藏数据是opp主要目标之一,数据项通常放在私有部分,组成类接口的成员函数放在公有部分;

不必要在类声明中使用关键字privat,因为这是类对象的默认访问控制;

public与private之间唯一的区别是,结构的默认访问类型是public,而类为prite;

实现类成员函数:

返回值类型  类名::成员函数名(参数表)
{
          函数体
} 

访问类成员

对象成员的访问包括:
       ●圆点访问形式:对象名.公有成员
       ●指针访问形式

对象指针变量名->公有成员

扫描二维码关注公众号,回复: 62872 查看本文章
函数重载:函数名相同,但参数不相同(类型不同,或者个数不同)的一组函数。

参数个数相同      参数类型不同

定义成员函数时,使用作用域解析运算符(::)来标示函数所属的类;

类方法可以访问类的private组件;

例如:void stock::update(double price)

类方法的完整名称中包括类名。

其定义位于类声明中的函数都将自动成为内联函数;

类的构造函数和析构函数

构造函数的作用是:

 为对象分配空间;对数据成员赋初值;请求其他资源

c++提供了一个特殊的成员函数--类构造函数,专门用于构造新对象,将值赋给他们的数据成员

构造函数没有返回值,实际上构造函数没有声明类型;

构造函数的参数标识的不是类成员,而是赋给类成员的值,因此,参数名不能与类成员相同;

析构函数是用于取消对象的成员函数

当一个对象作用域结束时,系统自动调用析构函数

析构函数的作用是进行对象消亡时的清理工作

没有用户定义析构函数时,系统提供缺省版本的析构函数
析构函数名为:~类名
析构函数没有参数,也没有返回类型

c++提供了两种使用构造函数来初始化对象的方式:

第一种方式:显示地调用析构函数  例如:stock food=stock(“world cabbage”,250,1.25);

第二种方式:隐式地调用析构函数   例如:stock garment(”furry mason“,50,2.5);

默认构造函数:

默认构造函数是在未提供显式初始值时,用来创建对象的构造函数。

格式:

格式:
funname(参数列表):初始化列表
{  函数体,可以是空函数体  } 
初始化列表的形式: 
成员名1(形参名1),成员名2(形参名2),成员名n(形参名n) 

对象生存期结束时,需要做清理工作,比如:释放成员(指针)所占有的存储空间

析构函数可以完成上述工作。

析构函数自动调用(隐式调用)

析构函数没有返回值,不能有参数,也不能重载

类名::~类名()
{
       函数语句
}

定义格式如下(类外实现): 


this 指针

一般来说,所有类方法都将this指针设置为调用它的对象的地址;

当参数与成员变量名相同时,如this->x = x,不能写成x = x。

复制构造函数:

复制构造函数用一个已有同类对象创建新对象进行数据初始化

C++为类提供默认版本的复制构造函数

程序员可以定义用户版本的复制构造函数

 语法形式

  类名::类名(const  类名  & 引用名 ,  …);

浅复制:

在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。

即:对于复杂类型的数据成员只复制了存储地址而没有复制存储内容

默认复制构造函数所进行的是简单数据复制,即浅复制 

深复制:

通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。

自定义复制构造函数所进行的复制是浅复制。 

1.深复制构造函数必须显式定义
2.深复制构造函数的特点
①定义:类名::类名([const]类名 &对象名);
②成员变量的处理:对复杂类型的成员变量,使用new操作符进行空间的申请,然后进行相关的复制操作
常成员:

在类的尘缘函数后面加const关键字,则该成员函数成为常量成员函数 

类型说明符函数名(参数表) const;

在数据成员前面加上const,成为常数据成员

静态成员函数

除静态数据成员以外,一个类还可以有静态成员函数。

静态函数仅可以访问静态成员,

或是静态成员函数或是静态数据成员。

静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。

静态成员函数没有this指针,只能对静态数据操作

定义静态成员函数的格式如下:

    static返回类型静态成员函数名(参数表);

    与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:

   类名::静态成员函数名(实参表)

   对象. 静态成员函数名(实参表)

   对象指针->静态成员函数名(实参表)

友元函数

如果在本类(类A)以外的其他地方定义了一个函数(函数B)
这个函数可以是不属于任何类的非成员函数,
也可以是其他类的成员函数,
在类体中用friend对其(函数B)进行声明,此函数就称为本类(类A)的友元函数。
友元函数(函数B)可以访问这个类(类A)中的私有成员
类的包含

构造函数 ( 形参表 ) : 对象成员1(形参表 ) , … , 对象成员n (形参表 ) ;

定义类
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class student  //类名称
{
    string name;
    int no;
    int score[3];     //数据成员
    float average;
    int order;
    public:
    student(int id,string na,int x,int y,int z):name(na),no(id)
    {
    score[0]=x;
    score[1]=y;
    score[2]=z;
    order=1,average=(score[0]+score[1]+score[2])/3;
    }
    student()
    {
        score[0]=score[1]=score[2]=0;
        order=1,average=0;
    }
    int getNo(){return no;}
    float getAverage(){return average;}
    void setAverage(int avg){average=avg;}      //成员函数
    void setOrder(int x){order=x;}
    int getOrder(){return order;}
    string getName(){return name;}
    void setName(string name){this->name=name;}
    void display();
};   //必须加分号

小结:

指定类的设计的第一步是提供类声明。类声明李斯结构声明,可以包括数据成员和函数成员。声明有私有部分,在其中声明的成员只能通过成员函数进行访问;声明还具有公有部分,在其中声明的成员可被使用类对象的程序直接访问。通常,数据程岩被放在私有部分中,成员函数被放在公有部分中;

公有部分的内容构成了设计的抽象部分--公有接口,将数据封装到私有部分中可以保护数据的完整性,这杯称为数据隐藏。因此,c++通过类使得实现抽象,数据隐藏,和封装等opp特性很容易;

c++试图让用户定义的类型尽可能与标准类型类似,因此可以声明对象;

如果希望成员函数对多个对象进项操作,可以将额外的对象作为参数传递给它。如果方法需要显示地引用调用它的对象,则可以使用this指针。由于this指针被设置为调用对象的地址,因此*this是该对象的别名。






猜你喜欢

转载自blog.csdn.net/qq_20017379/article/details/80037039