首页 > 技术文章 > 非static成员函数通过类名::来调用,空指针调用成员方法不出错!

albert1017 2014-07-04 10:42 原文

首先来看这一段代码:

#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);
   ....
   }  

 

推荐阅读