1. 结构体的扩充
结构体是C语言的一种自定义的数据类型,在结构体中可以含有多种不同类型的数据。C++语言对结构体类型进行了扩充,它不仅可以含有不同类型的数据,而且还可以含有函数。
例如下面声明了一个扩充的结构体Complex:
1 | struct Complex{ //声明了一个名为Complex的结构体 |
结构体中的数据和成员都是结构体的成员,在C++中,通常把结构体中的数据成为数据成员,把函数称为成员函数。为了访问这些成员函数,必须先定义该结构体类型的变量,然后像访问结构体中的数据一样进行访问。
C++提供了一种比结构体更安全有效的数据类型-类。类与结构体的扩充形式十分相似。上面的结构体类型Complex可以用类改写如下:
1 | class Complex{ //声明了一个名为Complex的类 |
类是一种数据类型,它是一种用户定义的抽象的函数类型。C++规定,在默认情况下,类中的成员是私有的,结构体中成员是共有的。
2. 类的声明
可以得出,类类型声明的一般形式如下:
1 | class 类名{ |
说明:
(1)私有成员(用private声明)包括数据成员和成员函数只能被类内的成员函数访问,公有成员(用public声明)包括数据成员和成员函数既可被类内的成员函数访问,也可被类外的对象访问。
(2)除了private和public之外,类中的成员还可以用另一个关键字protected来说明。被protected说明的数据成员和成员函数称为保护成员。保护成员可以由本类的成员函数访问,也可以由本类的派生类的成员函数访问。
(3)数据成员可以是任何数据成员,但不能是用自动(auto)、寄存器(register)或外部(extern)进行说明。
3. 成员函数的定义
类的成员函数是函数的一种,它也有函数名、返回值类型和参数表,用法和普通函数差不多,只是它属于一个类的成员。成员函数可以访问本类中任何成员(包括private、protected、public)。
成员函数的三种定义方式
第一种:在类声明中只给出成员函数的原型,而将成员函数的定义放在类的外部。(类内声明,类外定义)
这种成员函数在类外定义的一般形式如下:
1 | 返回值类型 类名::成员函数名(参数表){ |
说明:在类声明中,成员函数的原型的参数表中可以不说明参数的名字,而只说明它们的类型。但是,在类外定义成员函数时,不但要说明参数表中的参数的类型,还必须要指出其参数名。
第二种:将成员函数直接定义在类的内部。
说明:编译器会将这些函数隐含地定义为内联成员函数。这种定义内联成员内联函数的方法没有使用关键字inline进行声明,因此称为隐式定义。
第三种:在类内函数原型声明前或在类外定义成员函数前冠以关键字inline,因此称为显示定义。
说明:可以在声明函数原型和定义函数时同时写inline,也可以在其中一处声明inline,效果是相同的。都能按内联函数处理 。使用inline定义内联函数时,必须将类的声明和内联成员函数的定义都放在同一个文件(或同一个头文件中),否则编译时无法进行代码置换。
4. 对象的定义及使用
4.1 对象的定义
可以用以下两种方法定义对象:
(1)在声明类的同时,直接定义对象。即直接在声明类的右花括号“}”后,直接写出属于该类的对象名表。例如:
1 | class Point{ |
在声明类Point的同时,直接定义了对象op1,op2。
(2)声明了类之后,在使用时再定义对象。其一般形式如下:类名 对象名1,对象名2,..... ;
例如Point op1,op2;
4.2 对象中成员的访问
不论是数据成员,还是函数成员,只要是公有的,在类的外部可以通过类的对象进行访问。访问对象中的成员通常有一下三种方法。
(1)通过对象名和对象选择符访问对象中的成员
其一般形式是: 对象名.数据成员名
或者 对象名.成员函数名[(实参表)]
说明:.
叫做对象选择符,简称点运算符
(2)通过指向对象的指针访问对象中的成员
在定义对象时,若我们定义的是指向此对象的指针,则访问此对象的成员时,不能用.
操作符,而应该使用->
操作符。例如:
1 | class Date{ |
在此,ptr->year
表示ptr
当前指向对象中d
中的成员year
,因为(*ptr)
就是对象d
,(*ptr).year
表示的也就是对象d
中的成员year
。所以有如下等价关系:
(3)通过对象的引用访问对象中的成员
如果为了一个对象定义了一个引用,也就是为这个对象起了一个别名、因此完全可以通过引用来访问对象中的成员,其方法与通过对象名来访问对象中的成员是相同的。例如:
1 | class Date{ |
由于d2是d1的引用(即d2和d1占有相同的存储单),因此d2.year和d1.year是相同的。