class内部处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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才被调用——虽然大部分时候它是这样被调用的。


以上是关于class内部处理的主要内容,如果未能解决你的问题,请参考以下文章

class内部处理

class内部处理

Pig ERROR 2998:未处理的内部错误(错误名称 MY_CLASS_NAME)

Xcode 快速开发 代码块

ForegroundService没有从片段开始?

解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段