类的成员、内联/外联函数、指向成员的指针

成员函数与数据成员

类的成员可以是任意类型的变量、任意类型的函数,一般情况下,成员变量被定义在private分区,成员函数被定义在public分区。

内联函数/外联函数

  • 内联函数:在类体内声明,在类体内实现
  • 外联函数:在类体内声明,在类体外实现
class Date{
private:
    int y,m,d;
public:
    int getY(){ //内联函数
        return y;
    } //类体内实现
    int getM(); //外联函数,声明的时候没有{},以;结尾
}; //类体结束
int Date::getM() {
    return m;
} //类体外实现

在类体外实现外联函数的时候,按照类型 类名::函数的格式,其中函数除了;其他的必须原封不动抄下来,函数名、参数、参数的名字一个都不能错

构造函数也可以在类体内声明,在类体外实现,不过因为构造函数没有函数类型,所以在实现的时候不写函数类型。

class Date{
private:
    int y, m, d;
public:
    Date();//声明
};
Date::Date() {
    y=2020,m=5,d=15;
}//实现

外联函数要想“融入集体”,变成内联函数,只要在实现过程中,最前面加上inline即可

class Date{
private:
    int y, m, d;
public:
    Date();
};
inline Date::Date() {
    y=2020,m=5,d=15;
}

指向数据成员的指针

可以在类体外定义指针,使其指向类体内的某个public数据成员,并可以通过该指针修改对应数据成员的值。指针的格式为
成员类型 类名::*指针名=&类名::成员;

class Date{
public:
    int t;//公有数据成员t
};
//对照着上面的格式看
int Date::*p=&Date::t;//指向t的指针p
int main()
{
    Date a;
    a.t=2;//直接调用t进行赋值
    cout<<a.t<<endl;
    a.*p=3;//通过指针进行赋值
    cout<<a.t<<endl;
    return 0;
}

输出:

2
3

指向成员函数的指针

可以在类体外定义指针,使其指向类体内的某个public成员函数,并可以通过该指针调用对应的成员函数。指针的格式为
函数类型 (类名::*指针名)(参数类型)=&类名::成员函数名
对于参数类型,如果没有参数就不填,但括号还得留着;如果有多个参数,就只写参数类型,中间用逗号隔开,不写参数名;

class Date
{
public:
    Date(){a=10;}//打酱油的构造函数
    int getA(){//无参数的成员函数1
        return a;
    }
    int plus(int b){//一个参数的成员函数2
        return a+b;
    }
    int mult(int j, int k){//两个参数的成员函数3
        return a*(j+k);
    }
private:
    int a;
};
//对照着上面的格式看
int (Date::*pg)()=&Date::getA;//指向函数1
int (Date::*pp)(int)=&Date::plus;//指向函数2
int (Date::*pm)(int, int)=&Date::mult;//指向函数3
int main()
{
    Date d;
    cout<<(d.*pg)()<<endl;//没有参数也不能省略括号
    cout<<(d.*pp)(6)<<endl;
    cout<<(d.*pm)(2,3);//将参数填在第二个括号里
    return 0;
}

输出:

10
16
50

其中16=10+6,50=10*(2+3)
上面程序中的主函数部分其实就相当于:

int main()
{
    Date d;
    cout<<d.getA()<<endl;
    cout<<d.plus(6)<<endl;
    cout<<d.mult(2,3);
    return 0;
}

输出结果一样,只不过前者是用花里胡哨的指针操作的,后者是直接调用函数操作的。


本人是在读大学生,系列教程主要为了便于我的同学们参考,其中可能有很多不妥之处,望各位大佬雅正。
公众号:网织青春zcwlgc2019

猜你喜欢

转载自blog.csdn.net/pyx2466079565/article/details/106173858