C++编程入门(二) 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

成员函数

类的成员包括成员函数和数据成员。之前我们也都接触过了,这一节详细的看这两部分需要注意的地方。先看成员函数需要注意的地方:

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是同步变化的。