C++类的课程笔记
类的定义
C++允许用户以类的格式自定义数据类型,类的基本思想是数据抽象和封装。类要实现数据抽象和封装,需要先定义一个抽象数据类型。数据抽象类型由数据和对数据的操作。
数据成员和成员函数
当结构体扩展为除了数据也包含函数作为成员,这样的结构体被称为类。类中的数据称为数据成员,类中的函数称为成员函数。当类具体到某个问题时,此时的类被称为对象,对于数据的处理就由具体的对象操作成员函数来实现。
注;调用函数时使用“.”
成员函数的类外定义
C++中每个类定义都引入了一个类定义域,类定义中声明的数据成员和成员函数都具有类定义域。成员函数在类外定义时,函数名字前面要加类名字和作用域符“::”,表示这个函数是在其所属的类作用域内,是这个类的成员函数,不同于全局函数。
访问控制和封装
访问限制符
C++通过限制成员的访问权限来设置边界,实现信息隐藏。关键字public,private和protected被称为访问限定符。访问限定符在类定义中使用,一般语法如下:
Struct 类名{
public:
公有成员声明;
private:
私有成员声明;
protect:
被保护成员声明;
};
访问限定符在类定义中出现的顺序和出现的次数没有限制。一个访问限定符的作用会持续到出现下一个访问限定符或类定义结束。如果没有指定访问限定符,struct成员的成员默认访问限制为public。
public成员在程序的任何函数或类中都可以被访问。
private成员只能由类自己的成员函数或友元访问,需要隐藏的信息应该声明为private。
protected成员的访问权限介于public和private之间,主要用于继承中。
注:应该尽可能的限制类成员的可访问性。
类和对象
将数据和操作捆绑在一起,并加上访问限制,这在面向对象中称为封装。对象是客观事物的抽象,类是一组具有相同属性和行为的对象的抽象,对象又称为类的实例。
在C++中,类是一种数据类型,而对象就是这种类型的变量。
面向对象编程的主要工作就是创建一组对象并给它们发送消息。(发送消息就是调用成员函数)。
关键字class,如果class的成员没有设置访问限制符,则默认为private;
this指针
每个成员函数都有一个隐含的参数,指向接收消息的对象,称为this指针。
例:X类的this指针的类型是X*。
This指针是一个常量,含有当前实施调用的对象的地址。不能改变this指针的值,也不能取this指针的地址。
this在成员函数中最常用于:
(1) 区分与局部变量重名的数据成员;
(2) 返回当前对象;
(3) 获取当前对象的地址。
访问器和修改器
类的数据成员一般限定为private,以杜绝外部对类数据的访问,但有些数据是外部需要取得和修改的,这会破坏数据的封装性,较好做法是将数据成员限定为private,并提供public成员函数来对其访问,这种成员函数被称为访问器和修改器。
例:数据成员XX的访问器函数一般命名为getXX,修改器命名为setXX。
友元
有的函数需要访问一个类的私有数据,C++引入了friend关键字,如果想让非成员函数访问一个类中的私有数据,应该在类中将这个函数声明为friend(友元)。
类的友元可以访问类的私有数据,但友元必须在被访问的类中声明。且一个类的友元可以是全局函数,另一个类的成员函数或另一个类。
注:friend关系是不可传递的
构造函数和析构函数
在类中可以定义两种特殊的函数:构造函数和析构函数。构造函数在任何需要创建对象的时候都会被自动调用,负责对象的初始化;析构函数则在销毁对象时被自动调用,负责对象相关资源的清洁工作。
构造函数
构造函数是一种特殊的成员函数,能够在创建对象时被自动调用,负责对象的初始化。构造函数的名字和类名字相同,它没有返回值。构造函数的参数通常为数据成员提供初始值。且会设置一个没有参数的构造函数,在默认初始化时调用。
构造函数的初始化列表
引用类型,const数据成员和类类型的数据成员不能使用赋值的方式提供初始值,构造函数初始化列表就是针对这一情况。初始化列表形式如下:
成员1(初始值1)[,成员2(初始值2),……]
初始化列表位于构造函数的参数表之后,函数体之前:
构造函数(参数表):初始化列表 {函数体}
普通数据成员也可以用这种格式进行初始化,且使用初始化列表效率更高。
注:成员初始化的顺序与它们在类定义中的顺序一致。
析构函数
析构函数负责在对象生存期结束时返回相关资源和自动释放资源。
析构函数的名字是类名字前加波浪线“~”。析构函数没有返回类型,也没有任何参数,析构函数不能重载,只能为一个类定义唯一一个析构函数。
以上就是就是类和对象的基本内容,此外还有几个零碎知识点:
类的成员函数可以在类内声明,然后在类外定义
类的构造函数定义两个,一个有参数一个无参数,无参数的构造函数可默认初始化