成员函数
类的成员包括成员函数和数据成员。之前我们也都接触过了,这一节详细的看这两部分需要注意的地方。先看成员函数需要注意的地方:
1. 成员函数的声明必须在类体内,而定义可以放在类体内,也可以放在类体外。一般只有代码简短的成员函数才放在类体内定义。
2.在类体内定义的成员函数是内联函数(inline),在类体外定义的成员函数是外联函数。内联函数我们学过的,就是适用于代码简短的函数,编译的时候将内联函数的代码替换调用的代码,也就是说内联函数不是被调用的,而是直接运行的。调用会浪费时间和系统资源,所以内联函数能够提高程序效率。
3.类的外联函数可以转为内联函数,只需要在类体外实现的时候,在返回类型前面加inline就可以了。
4.除了析构函数外,所有的成员函数都能重载,包括构造函数也能重载。析构函数就一个,这个上一节说过。
静态数据成员
数据成员有访问权限:public、private、protected,这一节不说这个了。我们重点说静态数据成员。
1.应用场合:某个类的所有对象都有相同的属性,这个属性要变大家都变。
2.静态数据成员属于类,是所有的对象共有的,不单独属于某个对象
3.静态数据成员也有访问权限:public、private、protected。
4.静态数据成员的声明方法为在数据类型前加static
5.静态数据成员在类体外进行初始化,并且必须初始化,初始化格式为数据类型 类名::静态数据成员名=值;
静态成员函数
有同学可能已经猜到了,强大了C++有静态数据成员,就必然有静态成员函数的概念。需要注意:
1.静态成员函数属于类,不单独属于某个对象。
2.所以静态成员函数只能直接访问静态数据成员。
3.静态成员函数也只能调用其他的静态成员函数,不能调用一般的成员函数。
4.静态成员函数的声明方法为在返回类型前加static
5.静态成员函数的调用方法有两张,通过类访问和通过对象访问。通过类访问的方法为:类名::静态成员函数名(参数表)。通过对象访问的方法是对象名.静态成员函数名(参数表)。
6.静态成员函数的实现可以在类体内,也可以在类体外。
举例说明
刚才说了这么多这么绕的知识点,还是用例子来讲解吧:
#include <iostream>
using namespace std;
class Point
{
public:
Point(int a,int b=3){x=a;y=b;}//声明并实现构造函数
void setXY(int a,int b){x=a;y=b;}
void move(int a,int b){x+=a;y+=b;}
void printPoint(){cout<<"x= "<<x<<" y= "<<y<<" z= "<<z<<endl;}
static moveZ(int incrz){z+=incrz;}
private:
int x,y;
static int z;
};
int Point::z=0;
void main()
{
Point p1,p2(3);
p1.setXY(1,2);
p1.printPoint();
p2.printPoint();
p1.moveZ(2);
p1.printPoint();
p2.printPoint();
Point::moveZ(2);
p1.printPoint();
p2.printPoint();
}
程序共有6行输出如下:
x= 1 y= 2 z= 0
x= 3 y= 3 z= 0
x= 3 y= 3 z= 2
x= 3 y= 3 z= 2
x= 3 y= 3 z= 4
x= 3 y= 3 z= 4
这是一个同一水平面的Point类:所有的对象拥共用相同的z值。第13行定义静态数据成员z,第10行定义了静态成员函数moveZ用来改变z值。第15行给z初始化,注意格式哈。
第20行和21行进行输出,对应输出的1、2行。
第22行通过对象p1调用静态成员函数moveZ,第23行和24行的输出对应输出的3、4行,可以看到z是同步变化的。
第25行通过类名调用静态成员函数moveZ,第26行和27行的输出对应输出的5、6行,也可以看到z是同步变化的。