成员函数与数据成员
类的成员可以是任意类型的变量、任意类型的函数,一般情况下,成员变量被定义在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