c++成员函数的存储方式---11

原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/

成员函数属于一个类的成员,出现再类体中。可以被指定为公有,私有或受保护的。

1.在类外面定义成员函数时,需要用类名加作用域限定符(::),如下代码:

#include <iostream>
#include <string>
using namespace std;

class _test_myclass
{
public:
    void display(const int &value);  //在类内声明成员函数
}class1;

void _test_myclass::display(const int &value) //在类外定义成员函数,用作用域操作符
{
    cout << "value is "<<value<<endl;
}

int main(int argc,const char* argv)
{

    class1.display(100);
    return 0;
}

2.inline成员函数

inline成员函数为内敛函数(也叫内置函数),在类内定义的成员函数可以不用加inline关键字。因为类内成员函数默认为内置函数。

#include <iostream>
#include <string>
using namespace std;

class _test_myclass
{
public:
    void display(const int &value)   //类内成员函数无需添加inline关键字
    {
        cout << "value is "<<value<<endl;
    }

}class1;

inline void display2(const int &value)   //声明为内置函数
{
   cout << "value is "<<value<<endl;
}

int main(int argc,const char* argv)
{

    display2(100);
    return 0;
}

3.成员函数的存储方式

用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。

按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分配存储单元,如图8.4所示。

图8.4

能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。如图8.5所示。

图8.5

显然,这样做会大大节约存储空间。C++编译系统正是这样做的,因此每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间。如果声明了一个类:

class Time
{
  public:
  int hour;
  int minute;
  int sec;
  void set( )
  {
      cin>>a>>b>>c;
  }
};

可以用下面的语句来输出该类对象所占用的字节数:

  cout<<sizeof(Time)<<endl;

输出的值是12。

这就证明了一个对象所占的空间大小只取决于该对象中数据成员所占的空间,而与成员函数无关。

函数代码是存储在对象空间之外的。如果对同一个类定义了10个对象,这些对象的成员函数对应的是同一个函数代码段,而不是10个不同的函数代码段。需要注意的是: 虽然调用不同对象的成员函数时都是执行同一段函数代码,但是执行结果一般是不相同的。

不同的对象使用的是同一个函数代码段,它怎么能够分别对不同对象中的数据进行操作呢?
原来C++为此专门设立了一个名为this的指针,用来指向不同的对象。需要说明:
不论成员函数在类内定义还是在类外定义,成员函数的代码段都用同一种方式存储。
不要将成员函数的这种存储方式和inline(内置)函数的概念混淆。
应当说明: 常说的“某某对象的成员函数”,是从逻辑的角度而言的,而成员函数的存储方式,是从物理的角度而言的,二者是不矛盾的。

原文地址:https://www.cnblogs.com/zxouxuewei/p/5730980.html