类和对象

知识梳理

一、类的定义

C++允许用户以类的形式自定义数据类型,反映待解决问题中的各种概念,以更自然的方式编写程序。类的基本思想是数据抽象和封装。

1、基本语言定义的ADT

抽象数据类型由两部分组成:一组数据和对这些数据的操作。

便利店的商品销售活动

商品销售数据包括商品编号,单价和购买数量。销售商品时,输入商品编号、单价和数量,系统计算总金额,打印购物清单上的条目。用基本语言定义的SalesData 类型,表示商品销售数据。

//商品销售数据

struct SalesData{

    string productNo; //商品编号

    double price; //价格

    unsigned unitSold; //售出数量};

//输入一条商品销售记录

void read(SalesData *psd)

{cin >> psd -> productNo >> psd -> price >> psd -> unitSold;}

//计算一笔商品销售总收入的函数

double totalRevenue(SalesData *psd)

{return psd -> price * psd -> unitSold;}

//打印一条商品销售记录和总销售额

void print(SalesData *psd)

{cout << psd -> productNo <<":"<<psd -> price << " "<< psd -> unitSold << totalRevenue(psd) << endl;}

SalesData采用结构体加全局函数的方式实现,结构体保存数据,函数定义对这些数据的操作,数据通过结构体指针参数传递给函数。使用SalesData客户程序需要定义一个结构体类型的数据对象,再将它的地址传递给特定的函数来执行相应的操作。

//使用SalesData 时的代码大致如下:

SalesData sd; //定义结构体类型的变量read(&psd); //读入数据

print(&psd); //输出商品记录和总收入

2、数据成员与成员函数

结构体内的函数被称为成员函数,结构体中的数据则称为数据成员。扩展的结构体被称为类,结构体类型的变量被称为对象。

①数据成员的类內初始化

没有初始值的成员将被默认初始化。

数据成员类内初始值只能放在等号“=”右边,或者放在花括号“{}”里,不能使用圆括号“()”。

②成员函数的类外定义

成员函数直接在类内定义,也可以在类外定义。

类外定义的成员函数名字前面要加类名字和作用域符“::”,表示这个函数是在其所属的类作用域内,是这个类的成员函数,不同于全局函数。

成员函数定义虽处于类定义的花括号外,但还是在类作用域内,可以自由访问类的成员,不需要成员访问语法。

二、访问控制和封装

1、信息隐藏的必要性

控制对类中不同成员的访问,对客户程序员隐藏实现信息,客户程序员只对类的接口编程。

2、访问限定符

C++通过限定成员的访问权限来实现信息隐藏。关键字public、private 和protected 被称为访问限定符。如果没有指定访问限定符,struct 成员的默认访问限制为public。private 成员只能由类自己的成员函数或友元访问。

3、类和对象

发送消息就是调用成员函数。

例如s.print()就是向对象s 发送一个print()消息。

面向对象编程的主要工作就是创建一组对象并给它们发送消息。

C++引入了一个关键字class来定义类。如果class的成员没有设置访问限定符,则默认为private。

sizeof 运算符可以用于类类型、对象和类的数据成员。

SalesData sd;

sizeof(SalesData); //SalesData 类型的对象所占空间大大小

sizeof sd; //sd 的类型的大小,即sizeof(SalesData)sizeof(SalesData::price); 

//获取类成员的大小,无需具体的对象

4、this指针

每个成员函数都有一个隐含的参数,指向接收消息的对象,称为this指针。X类的this指针的类型是X*。

    this指针在成员函数中的用途:

①区分与数据成员同名的变量 

②返回当前对象

③取得当前对象地址

5、访问器和修改器

将数据成员限定为private,并提供public成员函数来对其进行访问,这种成员函数被称为访问器(accessor)和修改器(mutator)。常以一对getX()和setX() 函数的形式出现。

6、友元

C++引入了friend关键字,如果想让非成员函数访问一个类中的私有数据,应该在类中将这个函数声明为friend。

一个类的友元可以访问该类的私有数据。

在声明友元时要遵循一条规则:

友元必须在被访问的类中声明。

三、构造函数和析构函数

1、构造函数

构造函数是一种特殊的成员函数,在创建对象时被自动调用,负责初始化对象。

构造函数的名字和类名字相同,它没有返回类型。

一个类的构造函数最少写两个,一个是不带参数的。

如何定义对象

①类名 对象名

②类名 对象名()实参列表

2、构造函数初始化列表

成员1(初始值1)[,成员2(初始值2),…]

初始化列表位于构造函数的参数表之后,函数体之前:

构造函数(参数表) : 初始化列表 { 函数体 }

3、委托构造函数

ClassName(参数表):ClassName(参数表){函数体}

4、析构函数

析构函数负责在对象生存期结束时返回相关资源和自动释放资源。

当对象离开作用域时,或者用delete 释放在堆上创建的对象时,析构函数都会被自动调用。

析构函数的名字是类名字前加波浪线“~”。

如果一个类只包含按值存储的数据成员,则析构函数不是必须定义的。如果类中没有定义析构函数,编译器在需要时会自动合成一个析构函数。

四、const成员

1、const数据成员

const 可以限定类中的数据成员,描述对象中的常量。在数据成员声明前加const关键字就将其限定为常量。

2、const成员函数

将一个成员函数声明为const,表明这个成员函数不会修改对象的数据成员,能保证对象的常量性。

声明const成员函数的语法形式:

返回类型 成员函数名(参数表) const;

定义const成员函数的语法形式:

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

注意const成员函数声明和定义的语法:

对于在类外定义的const成员函数,必须在它的定义和声明中同时指定关键字const。

只有声明为const 的成员函数才可以被const 对象调用。非const对象可以调用const成员函数。

五、static成员

1、static数据成员

static数据成员对整个类类型只有一个,由这个类型的所有对象共享访问。

与全局变量相比,static数据成员有两个优点:

①static数据成员没有进入成员的全局作用域,只是在类作用域中,不会与全局域中的其他名字产生冲突。

②static成员仍然遵循访问控制规则,可以实现信息隐藏,static成员可以是private成员,而全局变量不能。

在类的数据成员声明前加关键字static,就使该数据成员成为静态的。

static数据成员属于类,不属于某个特定对象,因而不能在构造函数中初始化。static数据成员在类定义之外初始化,使用类名字限定。

在类的成员函数中可以直接访问static数据成员。在非成员函数中通过两种方式访问static数据成员。成员访问运算符“.”或“->”。

static成员只有一个副本,可以直接用类名字限定的静态成员名字访问 ClassName::StaticMemberName

注意:static成员仍然遵循访问控制的约束。

2、static成员函数

一般需要通过成员函数来访问数据成员,成员函数也可以访问static数据成员,可以将这样的成员函数声明为static成员函数。 

声明语法是在类定义中的函数声明前加static 关键字。在类外定义时不需要加关键字static。

static成员函数中不能访问非static数据成员,也不能调用非static成员函数。

六、指向成员的指针

1、数据成员的指针

(1)使用指向数据成员的指针的语法应该如下:

①对象.* 指向成员的指针

②对象指针 ->* 指向成员的指针

(2)定义指向数据成员的指针

成员类型 类名字::*指向成员的指针;

例如:int Simple::*pa;

定义了一个指向Simple类中的int成员的指针,它可以指向Simple类中的任何int成员。

2、成员函数的指针

普通的函数指针不能指向成员函数,即使参数表和返回类型相同。因为成员函数还有一项信息,即所属的类。定义指向成员函数的指针时也要指明成员函数的类类型。

基本语法:

返回类型 (类名::*指向成员函数的指针)(参数表);

 

有关类的使用与认识

要使用类解决问题,首先要明确类的功能,然后再想如何实现,需要什么,由此进一步分析出类的数据成员,从而解决问题。

在测试时,在数据成员定义完后,每编写一个成员函数都要进行测试,一步步进行,方便纠正。

注意:类名、结构体名必须大写,类內一定要有构造函数。两个不同内容的程序之间要空一行。

 

 

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值