近一个月学习了类对象,使得我对c++有了一个全新的认识。可这月的c++学习开拓了一种全新的思维方式。
面向对象编程的主要工作就是创建一组对象并给它们发送消息。
类设计是面向对象编程的核心。
面向对象的一个重要特征就是对象具有唯一标识,都是可区分的,所以每个对象都有唯一的存储地址,无数据成员对象的大小至少是1。
对象的所属类型称为类,类是对一组具有相同属性和行为的抽象。
类的基本思想是数据抽象和封装。数据抽象是一种依赖接口和实现分离编程的技术。将数据和操作捆绑在一起,并加上访问控制,这在面向对象中称为封装。
用来定义类的关键字我所学到的有struct、class和union三种。class和struct的定义稍有区别:如果class成员没有设置访问限定符,则默认为private;而struct成员的默认访问限定是public。union和struct一样,其成员的默认访问限定是public,但是其数据成员的存储方式不同于class和struct定义的类:union类的每个成员都是从对象的首地址开始存放,所以同一时间只有一个数据成员有效。
结构体内的函数被称为成员函数,结构体中的数据则称为数据成员。这样的结构体被称为类,这类结构体类型的变量被称为对象。
注意:成员函数像数据成员一样,不能独立使用,必须由结构体类型的变量使用成员语法来进行调用。
c++11允许为数据成员提供一个类内初始值,创建对象时,类内初始值讲用于初始化数据成员。没有初始值的成员将被默认初始化。数据成员类内初始值只能放在等号"="右边,或者放在花括号"{}"里,不能使用圆括号"()"。
c++中每个类定义都引入了一个类作用域,类定义中声明的数据成员和成员函数都具有类作用域。
注意:成员函数在类外定义时,函数名字前面要加类名字和作用域符"::",表示这个函数是在其所属的类作用域内,是这个类的成员函数,不同于全局函数。
this指针:每个成员函数都有一个隐含的参数,指向接收消息的对象,成为this指针。
this指针是一个常量,含有当前实施调用的对象的地址。不能改变this指针的值,也不能取this指针的地址。
this指针在函数中最常用于:1、区分与局部变量重名的数据成员;2、返回当前对象;3、获取当前对象的地址。
访问器和修改器:将数据成员限定为private,并提供public成员函数来对其进行访问,这种成员函数被称为访问器和修改器。数据成员XX的访问器函数一般命名为getXX,修改器函数名为setXX。访问器和修改器很好的体现了封装的概念。
友元:类的友元可以访问类的私有数据。
在声明友元时要遵守一条规则:友元必须在被访问的类中声明。一个类的友元可以是全局函数、另一个类的成员函数或另一个类。类A是类B的友元隐含着A的所有成员函数都是B的友元。
注意:1、友元关系是不可以传递的2、友元关系是不可以继承的:基类的友元不会自动成为其派生类的友元。
构造函数和析构函数:
构造函数是一种特殊的成员函数,能够在创建对象时被自动调用,负责对象的初始化。构造函数的名字和类名字相同,它没有返回类型(注意:不是void类型)。构造函数的参数通常为数据成员提供初始值。
注意:定义构造函数时至少定义两个,其中一个是不带参数的(说明对象时未带实参)。
初始化由构造函数完成,引用成员的初始化也应该在构造函数中,但又不能在函数体中使用赋值方式提供赋值。针对这种情况有一种特殊的语法,称为构造函数初始化列表:
成员1(初始值1)[,成员2(初始值2),…]
初始化列表位于构造函数的参数表之后,函数体之前:
构造函数(参数表):初始化列表{函数体}
注意:1、初始化列表中初值排列顺序不影响实际初始化顺序2、写在构造函数的函数体中 是成员先默认初始化,再在此处赋初值;在写初始化列表中,是直接初始化数据成员。
析构函数:c++中,由析构函数负责在对象生存期结束时返回相关资源和自动释放资源。当对象离开作用域时,或者delete释放在堆上创建的对象时,析构函数都会被自动调用。
const成员:
1)const是修饰this指针, 使得this这个常量指针指向一个常量,即 const * (const)this,所以const成员函数不会改变数据成员(非静态)。
2)常量对象,以及指向常量对象的引用或指针可以并且只能访问const成员函数。
3)非常量对象在const成员函数和非const成员函数两个版本中会选择非const成员函数。
注意:1、必须在构造函数初始值列表进行初始化,(或者申明const成员变量为static,可在类内初始化)2、const成员必须初始化 通过构造函数初始值列表提供初值; 只能在对象创建的时候进行初始化; 或者同时申明为static,可以在类内初始化3、引用成员必须初始化 通过构造函数初始值列表提供初值
static成员:
1)静态数据成员,必须要在类外定义,没有this指针,没有构造函数会初始化它,不属于任何对象。
注意:类外定义静态数据成员,指明所属类名,以免和一般静态数据混淆。
2)静态数据成员被类的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。
3)静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。
4)静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。 普通数据成员的只能声明为 所属类类型的 指针或引用。
5)const成员函数可以改变static数据成员