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;
}
:: 作用域运算符的使用
两个独立的类, 则互访时候, 只能是静态函数,可以通过 :: 访问。
如果 是继承关系, 则 静态非静态都可以。
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;
}