C++之作用域运算符::

来源:互联网 发布:阿里云和腾讯云哪个好 编辑:程序博客网 时间:2024/05/18 15:55
C++使用::运算符搞定很多东西,其中最基本的一个用处就是用来决议多继承中的重名成员。::运算符的本质是:左操作数是一个scope,右操作数是这个scope内的名字,可以是 scope,class,member或者function,variable等等,从左操作数指定的scope中找到有操作数这个实体。看起来非常优雅,不是么?可是,它有好几个缺陷。一、现实的常见的缺陷。分散在代码中,一旦改变会引起很多地方同时都需要改。其实这就是决策不能集中作出的一个典型现象。二、理论上的缺陷一。它丧失了虚拟性也就是多态性。这个问题说小也小说大也大,如果你就想静态调用,那么ok,非常好。如果我们需要多态性,那么对不起,不可能了。但是对于虚函数,我们一般期待的多态性。三、理论上的缺陷二。它主要体现在using语句中,我们知道,using可以引入一个名字,一个别的scope(主要是命名空间)中的名字,当然,也可以在子类中引用父类的名字以改变访问级别。这个行为的一个缺陷是引入了所有overload的名字,你不能引入部分实体。这在实践中一般没有问题,但是,一旦有了问题就非常难绕开。

:: 作用域运算符的使用

两个独立的类, 则互访时候, 只能是静态函数,可以通过 :: 访问。

如果 是继承关系, 则 静态非静态都可以。

struct CEngine
{
CEngine();
virtual ~CEngine();

void StartEngine();
void FreeEngine();
void UpdateEngine();
    
static void AccelerateEngine();            // 静态函数
     static int   AccelerateState;               // 静态变量
int    table;
};

// 游戏根类
struct CBaseGame
{
CBaseGame();
virtual ~CBaseGame();

void DestroyAllObject();
};

// 作用区运算符
struct CGame : public CBaseGame
{
    CGame();
    virtual ~CGame();

    void Initialize();
    void Update();
    void Draw();
    void Finalize();

    // 组合方式下的调用
    CEngine         m_engine;
   
};

//[-------------------------------
// 构造 析构函数区
CGame::CGame()
{
}

CGame::~CGame()
{
}

CEngine::CEngine()
{
table = 0;
}

CEngine::~CEngine()
{
}

CBaseGame::CBaseGame()
{
}

CBaseGame::~CBaseGame()
{
}
//
//]----------------------------------
int CEngine::AccelerateState = 0;            // 静态变量的初始化

void CEngine::AccelerateEngine()
{
     
}

void CEngine::FreeEngine()
{
   AccelerateEngine();         // 非静态成员可以访问静态成员,反之不可以
      AccelerateState = 456;
}

void CEngine::StartEngine()
{
}

void CEngine::UpdateEngine()
{

}


void CGame::Initialize()
{
//CEngine::StartEngine();                 // 也就是只有有继承关系的时候才可以使用CEngine::StartEngine()方式调用
CEngine::AccelerateEngine();              // 因为是静态函数,所以调用是可以的。
CBaseGame::DestroyAllObject();            // 而由于继承关系,在自己内部则可以通过作用域运算符调用,
                                           // 以表明是调用自己内部函数,还是根类函数
m_engine.AccelerateEngine();
m_engine.FreeEngine();

}

void CGame::Finalize()
{
}

void CGame::Draw()
{
}

void CGame::Update()
{
}

void CBaseGame::DestroyAllObject()
{
}

作用域:变量在程序中的起作用范围
简单分为:全局作用域、局部作用域、语句作用域
作用域优先级: 范围越小优先级越高
作用域运算符:“::”
如果希望在局部变量的作用域内使用同名的全局变量,可以在该变量前加上“::” ,“::”称为作用域运算符

//作用域
#include <iostream.h>

int avar=10;       //全局变量avar

void main()
{
   int avar=20;       //局部变量avar
 
   cout<<"avar is: "<<avar<<endl; //访问局部变量
   avar=25;    //1     //修改局部变量
   cout<<"avar is: "<<avar<<endl;

   cout<<"avar is: "<<::avar<<endl; //访问全局变量
   ::avar=30;   //2     //修改全局变量
   cout<<"avar is: "<<::avar<<endl;
}
0 0
原创粉丝点击