千家信息网

class内部处理

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,class A { public: int foo( ) { return val ; } static int staFun( ) { return
千家信息网最后更新 2025年01月22日class内部处理
class A  {  public:      int foo( )  {    return  val ;    }      static int staFun( )  {     return  staVal ;  }      static int staVal ;  private:      int val ;      char bit1 ;  } ;    class B : public A  {  public:      char foo( )  {    return  bit2;    }  private:      char bit2 ;  };

静态数据成员:

它被编译器提出于class之外,并被视为一个global变量(但只在class生命范围之内可见)

每个静态数据成员只有一个实体,存放在程序的数据段之中,

经由'.'运算符,对一个静态数据成员进行存取操作,只是语法上的一种便宜行事而已。静态数据成员其实并不在class object之中,因此存取它并不需要通过class object。

虽然你可以不靠class object 来存取一个静态成员,但其存取函数却得绑定于一个class object之上。(若静态成员的访问控制为protected或private,则必须通过存取函数来访问)

【注意:】类的静态数据成员,必须要在全局下进行定义,然后才能使用。

无论它的访问控制是什么,必须在main函数之前,对静态数据成员定义。

例如:int A::staVal = 0 ;

否则,编译器会报错:未定义的引用。

因为编译器把涉及静态数据成员的使用,都转换为直接使用,而静态成员在class中声明,外部无法看见。故需要在外部进行定义,使其后的代码可见。

成员函数的处理:

C++的设计准则之一:非静态成员函数至少和一般的外部函数有相同的存储效率。

C++编译器会把成员函数内化为一般的函数:

①改写函数原型,安插一个额外的参数this指针。用以提供一个存取管道,使类对象得以调用该函数。

int A::foo (A* const this)

若该成员函数是const,则变成:

int A::foo (const A* const this)

②对函数体中 类对象的非静态数据成员的存取操作,改为经由this指针来存取。

int A::foo (A* const this)

{ return this->val ; }

③将成员函数重新写成一个外部函数,对函数名称进行处理,使它在程序中成为独一无二的。

以上的转换操作结束之后,每个调用操作都要转换。

A objA ;  A * ptr = & objA ;    ptr->foo( ) ;   objA.foo() ;  //分别被转换为:  foo_intA( ptr ) ;  foo_intA( & objA ) ;

静态成员函数:

静态成员函数的主要特征是它没有this指针。

故其:

①它不能够直接存取其class中的非静态成员

②它不能够直接被声明为const、virtual

③它不需要经由class object才被调用--虽然大部分时候它是这样被调用的。


0