C++类机制太有名了,程序员应该都会喜欢这个设计。从最基本的说,类是封装了数据和操作。再不精确地说,定义了一个类,使用它可以在不需要知道内部如何实现的情况下,拿到一坨代码,就能很快地放入参数并使用。
以上是初次的直观认识,接下来探讨细节,如声明和定义、访问权限、创建对象。关于成员函数:定义可以在类内也可以在类外。定义在类内就是默认声明内联(内联就是性能优化,不过据说是不超过1行的函数才行),定义在类外要加上类名名空间(如void Date::set())表示该函数属于Date类。常成员函数不能改变对象的值,在声明和定义后加const(void func()const;)。重载只要参数不同。关于对象指针:进行对象的访问时,用对象名的话类似ObjectName.func(),或者用对象指针ObjectPointer->func()或者(*ObjectPointer).func(),其实最后一个就是先拿到对象。关于操作符:操作符的其实也是函数的形式。把函数名换成operator操作符(类似operator+)就可以重载自己的操作符。另外注意前增量返回引用,后增量返回临时变量,传参也不一样。流操作符返回引用,返回值类型是ostream。
接下来有关访问控制。由于类起到一个封装的作用,有些数据对外是看不见的,但是类内部函数肯定得看得见,不然没法处理。由此产生的各种情形,类机制中需要引入精确的访问控制。这里谈访问控制,实际上和之前文章提到的程序控制又有交集了。public下的是公有,用户可见。private下的是私有,类内部实现用,外部不可见。
关于静态成员。静态数据成员在类内声明,类外定义,防止多次定义。此时静态数据成员是属于整个类的,只创建一次,程序结束时销毁。操作静态数据成员要使用静态成员函数。静态成员函数可以不捆绑具体对象的情况下访问静态数据成员,在捆绑了具体对象的情况下可以访问私有成员。定义和成员函数类似,用static修饰。
关于友元函数。将一个普通的函数声明为类的友元函数,可以在该函数内部直接访问类的私有数据。声明方法是在类定义处添加该函数并用friend声明。友元函数在一定程度上是破坏了类的封装,所以使用要谨慎,要符合实际情景。关于操作符重载的友元函数使用,[]和=用成员函数形式,其他都用友元函数。