首先来看这一段代码:
#include <iostream> using namespace std; class A{ public: int k; void p1(){ cout<<"p1"<<endl; } }; int main(){ cout<<"test"<<endl; A *a = 0; a->p1(); return 0; }
上面的代码竟然不会出错!
using namespace std; class A{ public: int k; void p1(){ cout<<"p1 k="<<k<<endl; } }; int main(){ cout<<"test"<<endl; A *a = 0; a->p1(); return 0; }
这段代码就会出错了。
//函数定义 AudioHardwareInterface* AudioHardwareInterface::create() //函数调用 mAudioHardware = AudioHardwareInterface::create(); (来自Android2.2源码)
上面的代码也是合法的。
原因何在?
对于任何非静态的函数,只要是内部不含有非静态成员变量都可以用类名来进行调用。如果其内部含有非静态成员变量,肯定会说这个函数没有声明的,因为没有对象,就不会给成员变量分配空间,所以这种访问是无效的。而函数就不同了。即使没有对象,只要是其内部不进行未分配访问,其函数是可以顺利执行的。
典型的例子:
effitive C++ p59
PriorotyCustomer::operator=(const PriorityCustomer &rhs)
{
Customner::opertator=(rhs);
....
}