与类有关的知识总结

与类有关的知识总结
一、类的定义
1、抽象数据类型(ADT)数据抽象接口和实现分离,类的接口包括用户能执行的操作,类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。抽象数据类型由两部分组成:一组数据、对数据的操作。
2、数据成员与成员函数
C++扩展了struct的概念,使之可以包含函数作为成员。结构体内的函数被称为成员函数,结构体中的数据则称为数据成员。
扩展的结构体被称为类,结构体类型的变量被称为对象。
3、数据成员的类内初始化
C++11允许为数据成员提供一个类内初始值,创建对象时,类内初始值将用于初始化数据成员。没有初始值的成员将被默认初始化。数据成员类内初始值只能放在等号“=”右边,或者放在花括号“{}”里,不能使用圆括号“()”。
4、成员函数的类外定义
成员函数直接在类内定义,也可以在类外定义。C++中每个类定义都引入了一个类作用域。类定义中声明的数据成员和成员函数都具有类作用域。
5、成员函数的类外定义语法
类外定义的成员函数名字前面要加类名字和作用域符“::”,表示这个函数是在其所属的类作用域内,是这个类的成员函数,不同于全局函数。成员函数定义虽处于类定义的花括号外,但还是在类作用域内,可以自由访问类的成员,不需要成员访问语法。
二、访问控制和封装
1、访问限定符C++通过限定成员的访问权限来实现信息隐藏。关键字public、private 和protected 被称为访问限定符。访问限定符在类定义中使用,一般语法为
struct 类名
{
public:
公有成员声明;
private:
私有成员声明;
protected:
被保护成员声明;
};
访问限定符在类定义中的出现顺序和出现次数没有限制。一个访问限定符的作用会持续到出现下一个访问限定符或类定义结束。如果没有指定访问限定符,struct 成员的默认访问限制为public。
public成员在程序的任何函数或类中都可以被访问。private成员只能由类自己的成员函数或友元访问。protected成员可以在派生类中访问。访问权限介于public 和private 之间,主要用于继承中。protected 成员可以由类自己的成员函数、友元、派生类成员访问。
2、成员访问限定
增加了成员访问限定的类:类内部的安全性与一致性加强,降低了客户程序员操纵该类型的复杂程度,只要public部分的声明没有改变,则不会影响之前使用该类的客户程序代码。
应该尽可能限制类成员的可访问性,如果不确定,多隐藏通常比少隐藏要好。
3、C++的类和对象
对象是数据和操作的封装体。将数据和操作捆绑在一起,并加上访问控制,称为封装。数据描述对象的属性,操作描述对象的行为。
对象是客观事物的抽象,类是一组具有相同属性和行为的对象的抽象,对象又称类的实例。
外部程序通过类接口中提供的操作访问对象的数据,这称为向对象发送消息。同一个类的每个实例都有自己独立的数据,但是可以接收相同的消息。
C++中的类是一种数据类型,对象是这种类型的变量。发送消息就是调用成员函数。
面向对象编程的主要工作就是创建一组对象并给它们发送消息。对象能够持有的数据和接收的消息由它们所属的类决定。类设计是面向对象编程的核心。
4、class定义的类
C++引入了一个关键字class 来定义类,如果class的成员没有设置访问限定符,则默认为private。
5、对象的布局
每个对象都有自己的数据成员,类的成员函数并不在各个对象中存储,而是整个类存储一份,所有对象共享这些成员函数的定义。
无数据成员的对象的大小至少是1。
6、this 指针
每个成员函数都有一个隐含的参数,指向接收消息的对象,称为this指针。X类的this指针的类型是X*。this指针是一个常量,含有当前实施调用的对象的地址。不能改变this指针的值,也不能取this指针的地址。
this指针在成员函数中的用途:区分与数据成员同名的变量、返回当前对象、取得当前对象地址。
7、访问器和修改器
将数据成员限定为private,并提供public成员函数来对其进行访问,这种成员函数被称为访问器和修改器。常以一对getX()和setX() 函数的形式出现。与直接访问数据成员相比,访问器和修改器更好地体现了封装性。可以在修改器中进行数据有效性的验证,从而确保对象不会因外部修改而处于无效的状态。
8、友元
C++引入了friend关键字,如果想让非成员函数访问一个类中的私有数据,应该在类中将这个函数声明为friend。
在声明友元时要遵循一条规则:友元必须在被访问的类中声明。
一个类的友元可以是全局函数、另一个类的成员函数、另一个类。
friend关系不可传递,如果A是类B的友元,而类B是类C的友元,A不会自动成为C的友元。
应该尽量避免使用友元,友元会破坏类的封装性,增加类之间的耦合度。
三、构造函数和析构函数
1、构造函数构造函数在创建对象时被自动调用,负责初始化对象。构造函数的名字和类名字相同,它没有返回类型,是没有返回类型,不是返回void 类型。构造函数的参数通常为数据成员提供初始值。构造函数可以重载。在创建对象时,编译器会根据初始值的类型和个数来调用相应的构造函数。
2、构造函数初始化列表
类中有些成员不能使用赋值的方式提供初始值:引用成员,const 数据成员,类类型的数据成员。
针对这种情况的特殊语法称为构造函数初始化列表。初始化列表位于构造函数的参数表之后,函数体之前。
构造函数(参数表) : 初始化列表 { 函数体 }
如果成员是const、引用,或者是未提供默认构造函数的类类型,就必须通过构造函数初始化列表提供初值。
在初始化列表中,每个成员只能出现一次。成员初始化的顺序与它们在类定义中出现的顺序一致。
3、委托构造函数
委托构造函数使用所属类的其他构造函数执行自己的初始化过程,把部分或全部职责委托给了其他构造函数。语法形式:
ClassName(参数表):ClassName(参数表){函数体}
4、委托构造函数的执行流程
当一个构造函数委托另一个构造函数时,先依次执行受委托的构造函数的初始化列表和函数体,然后将控制权交还给委托者的函数体。
5、析构函数
析构函数负责在对象生存期结束时返回相关资源和自动释放资源。当对象离开作用域时,或者用delete 释放在堆上创建的对象时,析构函数都会被自动调用。析构函数的名字是类名字前加波浪线“~”。析构函数没有返回类型,也没有任何参数。析构函数不能重载,只能为一个类定义唯一一个析构函数。析构函数可以执行类设计者希望在最后一次使用对象之后执行的任何操作。如果一个类只包含按值存储的数据成员,则析构函数不是必须定义的。如果类中没有定义析构函数,编译器在需要时会自动合成一个析构函数。
6、构造函数和析构函数的调用
程序中无论以何种形式创建对象,都会调用构造函数。当对象生命期结束时,则会调用析构函数。析构函数绝大多数情况下都被自动地隐式调用,一般不要显式调用。
四、const 成员
1、const数据成员
const可以限定类中的数据成员,描述对象中的常量。在数据成员声明前加const关键字就将其限定为常量。const 数据成员在构造函数的初始化列表中初始化。创建对象时初始化其中的const 数据成员,之后const 成员的值在对象的整个生存期中都不会改变。
2、const成员函数
类的对象也可以由const限定为常量。类对象的变化更多是由成员函数的调用引起的,将一个成员函数声明为const,表明这个成员函数不会修改对象的数据成员,能保证对象的常量性。
声明const成员函数的语法形式:
返回类型 成员函数名(参数表) const;
定义const成员函数的语法形式:
返回类型 成员函数名(参数表) const { 函数体 }
对于在类外定义的const成员函数,必须在它的定义和声明中同时指定关键字const。
3、const成员函数的语法规则
只有声明为const的成员函数才可以被const对象调用。非const对象可以调用const成员函数。const成员函数中不能修改类的数据成员。const成员函数中不能调用其他非const成员函数。
4、const成员函数和对象的常量性
const X对象的地址是const X类型。
const在限定成员函数时对其参数表产生了影响。const 限定的成员函数其实是将const 关键字作用于隐含的this 指针,其类型成为了const X

5、const成员函数的定义和调用规则
允许为成员函数定义const和非const两个版本,这两个版本是重载函数。在这种情况下,对const对象,会选择调用const版本的成员函数;对非const对象,则调用非const成员函数。
五、static 成员
1、staic数据成员
static数据成员被当作该类类型的全局变量。对非static数据成员,每个对象都有自己的副本。static数据成员对整个类类型只有一个,由这个类型的所有对象共享访问。与全局变量相比,static数据成员有两个优点:static数据成员没有进入成员的全局作用域,只是在类作用域中,不会与全局域中的其他名字产生冲突;static成员仍然遵循访问控制规则,可以实现信息隐藏,static成员可以是private成员,而全局变量不能。
2、static数据成员的初始化
static数据成员属于类,不属于某个特定对象,因而不能在构造函数中初始化。static数据成员在类定义之外初始化,使用类名字限定。static成员只能定义一次,定义一般不放在头文件中,而是放在包含函数定义的源文件中。static数据成员可以是任何类型,甚至是所属类的类型。
3、static const数据成员
可以用static const定义类中的常量,static const数据成员在类外初始化,整值类型的static const可以在类定义里初始化,其他类型不能在类中初始化。
4、static数据成员的访问
在类的成员函数中可以直接访问static数据成员,在非成员函数中通过两种方式访问static数据成员:成员访问运算符“.”或“->”。像访问普通数据成员的语法一样,通过对象或指针来访问。
5、类名限定的静态成员名
static成员只有一个副本,可以直接用类名字限定的静态成员名字访问。注意:static成员仍然遵循访问控制的约束。
6、static成员函数
将成员函数声明为static成员函数的声明语法是在类定义中的函数声明前加static关键字,在类外定义时不需要加关键字static。static成员函数可以用成员访问语法调用,也可以直接用类名限定修饰名直接调用静态成员函数。static成员函数没有this指针,在static成员函数中显式或隐式地引用this指针都会引起编译错误。static成员函数中不能访问非static数据成员,也不能调用非static成员函数。
感悟:
类通过对封装的数据操作实现功能,成员函数通过对数据成员操作实现功能,成员函数应该单一化,每一个函数实现一个功能。类本身不能运行,需要定义对象,对象可以运行。使用类增强了函数的封装性,要掌握好类,不仅要理解与类有关的知识的概念,还要注意如何使用类,如何规范地使用类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值