类的成员函数

版权声明:欢迎分享(指明出处),若有错误还请指正!!! https://blog.csdn.net/zj19941201/article/details/78984250

性质:

类的成员函数(简称类函数)是函数的一种,也有返回值和函数类型,与一般函数的区别在于:它属于一个类的成员,出现在类体中。它可以被指定为private或者public或protected中的一种。

  注意:使用类函数时,要注意调用它的权限以及scope。例如,私有成员函数只能被本类中中的其他成员函数所调用,而不能被类外调用。成员函数可以访问本类对象中的任何一个成员(包括private和public中的),可以引用在本scope中有效的数据。

所以综上所述:一般的做法是将需要被外界调用的成员函数指定为public,它是类的对外接口。但有的函数不是为外界调用所准备的,而是为本类中的成员函数所调用的,就应该指定为private,作用是支持其他函数操作,是类中其他成员的工具函数(utility function),用户不能调用这些私有的工具函数。


很重要的一点是:类的成员函数是类体中十分重要的部分。假若一个类中不包含成员函数,就等同于c语言中的结构体,体现不出类在面向对象程序设计中的作用。

   定义:

成员函数的定义有两种形式:

1:直接在类体中进行定义;形式如下

class complex
{
public:
    void display()
    {
     ...
     }
private:
     ...
};//class complex

2:现在类体中进行声明,在类体外定义;形式如下

class complex
{
public:
   void display();
private:
   ...
};//class complex
void complax:: display()
{
   ...
}
注意:“: :”是作用域限定符(field qualifier)或称作用域运算符,作用是声明该函数是属于哪个类的。若不加“: :”则该函数为全局函数,不属于任何一个类中。

由上,引入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)虽然成员函数有上述测试可知不占用存储空间,但从逻辑上来说,成员函数和数据是封装在一对象中的,只允许本对象中的成员的函数访问同一对象中的私有数据。

猜你喜欢

转载自blog.csdn.net/zj19941201/article/details/78984250