类和对象专题总结

一、类
*1.定义:*类的基本思想是数据的抽象封装
数据的抽象是一种依赖接口和实现分离编程的技术。
类的接口包括用户能执行的操作,类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函。
2.基本语言定义的ADT
(1)抽象数据类型由两部分:一组数据和对数据的操作
结构体描述数据,全局函数描述对数据的操作,数据以参数的形式传递给函数。
(2)SalesData 采用结构体加全局函数的方式实现。
结构体保存数据,函数定义对这些数据的操作,数据通过结构体指针参数传递给函数。
基本语言实现SalesData的方式存在如下问题:
数据和操作之间的密切关系不能体现;使用时需要传递数据的地址;大量使用全局函数容易引起名字冲突。
3.数据成员和成员函数:
结构体内的函数被称为成员函数,结构体中的数据则称为数据成员,扩展的结构体被称为,结构体类型的变量被称为对象
4.数据成员的类内初始化:
如果在main()函数中定义SalesDate类型的变量:

int main()
{
     SaleaDatd s;
     ...
}

没有初始值的成员将被默认初始化
数据成员类内初始值只能放在等号“=”右边,或者放在==花括号“{}”==里,不能使用圆括号“()”
5.成员函数的类外定义:
类外定义的成员函数名字前面要加类名字和作用域符“::”,表示这个函数是在其所属的类作用域内,是这个类的成员函数,不同于全局函数
在类定义的花括号内定义的成员函数默认为inline 函数
在类外定义inline 成员函数,显式地在函数声明或定义前加关键字inline。
二、访问控制和封装
SalesData 的成员可以通过结构体变量访问,不仅可以调用成员函数,也可以访问数据成员。
1.访问限定符:
C++通过限定成员的访问权限来实现信息隐藏
关键字public、private 和protected 被称为访问限定符
访问限定符在类定义中使用,一般语法为

struct 类名
{
public:
公有成员声明;
private:
私有成员声明;
protected:
被保护成员声明;
};

(1)public 成员在程序的任何函数或类中都可以被访问,用于说明类接口中的成员,客户程序通过public 成员可以操纵该类型的对象。
(2)private 成员只能由类自己的成员函数或友元访问,需要隐藏的信息应该声明为private。
(3)protected 成员可以在派生类中访问,访问权限介于public 和private 之间,主要用于继承中。protected 成员可以由类自己的成员函数、友元、派生类成员访问。
结构体定义以“;”结束,成员函数一般为公有,数据成员为私有。
成员访问限定:
类内部的安全性与一致性加强
降低了客户程序员操纵该类型的复杂程度
类设计者改变类的内部工作方式时客户程序不受影响
2.类和对象
对象是数据和操作的封装体,数据描述对象的属性,操作描述对象的行为。
对象是客观事物的抽象,类是一组具有相同属性和行为的对象的抽象;外部程序通过类接口中提供的操作访问对象的数据,这称为向对象发送消息;同一个类的每个实例都有自己独立的数据,但是可以接收相同的消息。
sizeof 运算符可以用于类类型、对象和类的数据成员
数据成员按声明顺序储存;无数据成员的对象的大小至少是1。
class定义的类:如果class的成员没有设置访问限定符,则默认为private。
*3.this 指针:每个成员函数都有一个隐含的参数,指向接收消息的对象,称为this指针
==X类的this指针的类型是X
==
this指针是一个常量,含有当前实施调用的对象的地址
不能改变this指针的值,也不能取this指针的地址
this指针在成员函数中的用途:区分与数据成员同名的变量 ;返回当前对象;取得当前对象地址。
4.访问器和修改器:
将数据成员限定为private,并提供public成员函数来对其进行访问,这种成员函数被称为访问器(accessor)和修改器(mutator),
常以一对getX()和setX() 函数的形式出现。
5.友元(friend):
C++引入了friend关键字,如果想让非成员函数访问一个类中的私有数据,应该在类中将这个函数声明为friend
一个类的友元可以访问该类的私有数据
友元必须在被访问的类中声明

一个类的友元可以是:全局函数;另一个类的成员函数;另一个类。
friend关系不可传递;友元会破坏类的封装性,增加类之间的耦合度,该尽量避免使用友元。
三、构造函数和析构函数
1.构造函数(constructor):
构造函数在创建对象时被自动调用,负责初始化对象;
构造函数的名字和类名字相同,它没有返回类型,是没有返回类型,不是返回void 类型;
构造函数的参数通常为数据成员提供初始值;
构造函数可以重载;
在创建对象时,编译器会根据初始值的类型和个数来调用相应的构造函数;
构造函数的形式决定了初始化对象的方式。
2.构造函数的初始化列表:
a.类中有些成员不能使用赋值的方式提供初始值,引用成员,const 数据成员,类类型的数据成员。
b.针对这种情况的特殊语法称为构造函数初始化列表:成员1(初始值1)[,成员2(初始值2),…]
c.初始化列表位于构造函数的参数表之后,函数体之前:构造函数(参数表) : 初始化列表 { 函数体 }
如果成员是const、引用,或者是未提供默认构造函数的类类型,就必须通过构造函数初始化列表提供初值。
在初始化列表中,每个成员只能出现一次;
成员初始化的顺序与它们在类定义中出现的顺序一致,初始化列表中初值排列的顺序不影响实际的初始化顺序,如果可能的话,尽量避免用某些成员初始化其他成员。
3.委托构造函数:
委托构造函数(delegating constructor)
委托构造函数使用所属类的其他构造函数执行自己的初始化过程,把部分或全部职责委托给了其他构造函数
语法形式:
ClassName(参数表):ClassName(参数表){函数体}
4.对象的销毁和清除:
在对象生存期间,构造函数或其他成员函数可能为对象分配某些资源
例如为指针成员在动态存储区分配空间。
当对象生存期结束时,应返回或释放相关资源。
5.析构函数:
析构函数负责在对象生存期结束时返回相关资源和自动释放资源;
当对象离开作用域时,或者用delete 释放在堆上创建的对象时,析构函数都会被自动调用。
析构函数的名字是类名字前加波浪线“~”
析构函数没有返回类型,也没有任何参数;
析构函数不能重载,只能为一个类定义唯一一个析构函数。
析构函数主要被用来放弃在类对象的构造函数或生存期中获得的资源
如释放互斥锁或归还new 分配的空间。
如果类中没有定义析构函数,编译器在需要时会自动合成一个析构函数
6.构造函数和析构函数的调用:
程序中无论以何种形式创建对象,都会调用构造函数;
各种初始化方式都会引起相应的构造函数调用;
堆上的对象,数组元素对象都要调用构造函数初始化。
当对象生命期结束时,则会调用析构函数(一般为隐式调用)
四、const 成员
1.const 数据成员:
const 可以限定类中的数据成员,描述对象中的常量
const 数据成员在构造函数的初始化列表中初始化
创建对象时初始化其中的const 数据成员,之后const 成员的值在对象的整个生存期中都不会改变。
2.const 成员函数
类的对象也可以由const 限定为常量;
试图修改const 对象的操作会引起编译错误。
const成员函数不会修改对象的数据成员。
声明const成员函数的语法形式:

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

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

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

对于在类外定义的const成员函数,必须在它的定义和声明中同时指定关键字const 。
3,const成员函数的语法规则
只有声明为const 的成员函数才可以被const 对象调用
const 对象不能调用非const 成员函数
非const 对象可以调用const 成员函数
const 成员函数中不能修改类的数据成员
const 成员函数中不能调用其他非const 成员函数
4.const 成员函数和对象的常量性
X 类的成员函数的隐含参数this 指针是X类型;
const X 对象的地址是const X
类型。
const对象调用非const成员函数时;
形参this是X类型;
实参即当前对象的地址是const X
类型。
const 限定的成员函数其实是将const 关键字作用于隐含的this 指针,其类型成为了const X*。
形参this的类型const X*,实参类型X*,可以自动转换。
const 成员函数的this 指针是const X*类型,指向的对象是const,不能修改
5.const 成员函数的定义和调用规则:
(1)如果成员函数是非const 的,则只有非const 对象可以调用它;const 对象不能调用非const 的成员函数
(1)如果成员函数是const 的,则const 对象可以调用它;非const 对象也可以调用它,不会改变对象中的成员
(3)在这种情况下,对const 对象,会选择调用const 版本的成员函数;对非const 对象,则调用非const成员函数
6.static 成员函数
(1)static数据成员被当作该类类型的全局变量;
对非static数据成员,每个对象都有自己的副本;
static数据成员对整个类类型只有一个,由这个类型的所有对象共享访问。
(2)static数据成员没有进入成员的全局作用域,只是在类作用域中,不会与全局域中的其他名字产生冲突;
static成员仍然遵循访问控制规则 ,可以实现信息隐藏,static成员可以是private成员,而全局变量不能。
7.static数据成员的初始化
stat=ic数据成员属于类,不属于某个特定对象,因而不能在构造函数中初始化;
static数据成员在类定义之外初始化,使用类名字限定;
static成员只能定义一次,定义一般不放在头文件中,而是放在包含函数定义的源文件中
static数据成员可以是任何类型,甚至是所属类的类型
A.static const数据成员
可以用static const定义类中的常量;
static const 数据成员在类外初始化;
整值类型的static const可以在类定义里初始化。
B.static数据成员的访问
(1)在类的成员函数中可以直接访问static数据成员
(2)在非成员函数中通过两种方式访问static数据成员
成员访问运算符“.”或“->”
像访问普通数据成员的语法一样,通过对象或指针来访问
类名限定的静态成员名
static成员只有一个副本,可以直接用类名字限定的静态成员名字访
static成员仍然遵循访问控制的约束
C.static成员函数:
一般需要通过成员函数来访问数据成员;
成员函数也可以访问static数据成员。
声明语法是在类定义中的函数声明前加static 关键字
在类外定义时不需要加关键字static。
static成员函数中不能访问非static数据成员,也不能调用非static成员函数 。
8.指针
(1)指向成员的指针:
指针是保存内存地址的变量,既可以是数据的地址也可以是函数的地址;成员指针遵从同样的概念,只是指向的是类的成员。
(2)数据成员的指针:
如果有一个指向类成员的指针p,要取得指针指向的内容,必须用“*”运算符解引用
*p是一个类的成员,不能直接使用,必须指定对象或指向对象的指针来选择这个成员
使用指向数据成员的指针的语法应该如下:

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

指定指针指向的类型,说明它指向的是哪个类的成员
语法形式

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

(3)成员函数的指针
普通的函数指针不能指向成员函数,即使参数表和返回类型相同;
定义指向成员函数的指针时也要指明成员函数的类类型;
基本语法

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

有关类的认识和使用
注意事项:写代码应该书写规范。
1.定义类名、结构体名首字母大写;
2.两项不同内容的程序之间需要空一行;
3.类中一定要写构造函数;
4.get,set函数必须写,可以在类外修改数据;
5.类的数据成员定义完之后,每增加一个成员函数,在主函中队类进行测试,连调。
认识:
类将一组数据和其数组成员封装在一起。有效保护了数据成员,使数据成员不被更改;
类将一组数据成员及函数封装在一起方便实用。
使用类能更方便的解决一些程序问题,可以更好地编写程序,实现功能,调用类和对象会更加方便。

你可能感兴趣的:(C语言C++专题总结)