性质:
类的成员函数(简称类函数)是函数的一种,也有返回值和函数类型,与一般函数的区别在于:它属于一个类的成员,出现在类体中。它可以被指定为private或者public或protected中的一种。
注意:使用类函数时,要注意调用它的权限以及scope。例如,私有成员函数只能被本类中中的其他成员函数所调用,而不能被类外调用。成员函数可以访问本类对象中的任何一个成员(包括private和public中的),可以引用在本scope中有效的数据。
所以综上所述:一般的做法是将需要被外界调用的成员函数指定为public,它是类的对外接口。但有的函数不是为外界调用所准备的,而是为本类中的成员函数所调用的,就应该指定为private,作用是支持其他函数操作,是类中其他成员的工具函数(utility function),用户不能调用这些私有的工具函数。
很重要的一点是:类的成员函数是类体中十分重要的部分。假若一个类中不包含成员函数,就等同于c语言中的结构体,体现不出类在面向对象程序设计中的作用。
定义:
成员函数的定义有两种形式:
1:直接在类体中进行定义;形式如下
class complex
{
public:
void display()
{
...
}
private:
...
};//class complex
2:现在类体中进行声明,在类体外定义;形式如下
class complex注意:“: :”是作用域限定符(field qualifier)或称作用域运算符,作用是声明该函数是属于哪个类的。若不加“: :”则该函数为全局函数,不属于任何一个类中。
{
public:
void display();
private:
...
};//class complex
void complax:: display()
{
...
}
由上,引入inline function(内置成员函数)
c++要求对一般内置函数要用关键字 inline声明(指成员函数定义在类体外的),定义在类体内的可省略inline。但成员函数是否当做内置函数处理,取决于编译器,加了声明只是向编译器建议,最终还是编译器决定。一般来说,假若成员函数规模很小,不包括循环等控制结构,c++编译器会将它们当做内置函数来处理,以减少时间开销。形式如下:
class complex成员函数的存储方式
{
public:
complex (double r=0,double i=0):re (r) , im (i) { }//初值列
complex& operator += (const complex&);
complex& operator -= (const complex&);
complex& operator *= (const complex&);
complex& operator /= (const complex&);
double real() const {return re;}
double imag() const {return im;}
private:
double re,im;
friend complex& __doami (complex *, const complex&);
friend complex& __doaml (complex *, const complex&);
friend complex& __doapl (complex *, const complex&);
friend complex& __doams (complex *, const complex&);
};
inline complex&
__doapl (complex* ths,const complex& r)
{
ths->re +=r.re;
ths->im +=r.im;
return *ths;
}
我们知道,用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,按理说,要分别为数据和函数代码(指经过编译的目标代码)分配存储空间。做个假设:用同一个类去定义n个对象,那么是否为每一个对象的数据和函数代码分别分配存储空间,并将它们“封装”在一起呢?如下图:
但事实上并非如此,同一类的不同对象中的数据成员的值一般是不相同的,而不同对象的函数的代码是相同的,不论调用哪一个对象的函数代码,其实调用的都是相同内容的代码。即:
不妨做个测试:
double num2 :12 + int num1 :4 + char num3 :4 + float num4: 4 = 24
显然,这样会大大的节省存储空间。c++编译时正是这样做的。
说明:
(1)不论成员函数在类内定义还是类外定义,成员函数的代码段的存储方式是相同的,都不占用对象的存储空间。
(2)不要将成员函数的这种存储方式和inline函数的概念混淆;inline函数只影响程序的执行效率,而与成员函数是否占用对象的存储空间无关,两者不属于同一范畴。
(3)虽然成员函数有上述测试可知不占用存储空间,但从逻辑上来说,成员函数和数据是封装在一对象中的,只允许本对象中的成员的函数访问同一对象中的私有数据。