首先来看这一段代码:

#include <iostream>

using namespace std;

class A{
public:
int k;
void p1(){
cout<<"p1"<<endl;
}
}; int main(){
cout<<"test"<<endl;
A *a = ;
a->p1();
return ;
}

上面的代码竟然不会出错!

using namespace std;

class A{
public:
int k;
void p1(){
cout<<"p1 k="<<k<<endl;
}
}; int main(){
cout<<"test"<<endl;
A *a = ;
a->p1();
return ;
}

这段代码就会出错了。

//函数定义
AudioHardwareInterface* AudioHardwareInterface::create()
//函数调用
mAudioHardware = AudioHardwareInterface::create();
(来自Android2.2源码)

上面的代码也是合法的。

原因何在?

对于任何非静态的函数,只要是内部不含有非静态成员变量都可以用类名来进行调用。如果其内部含有非静态成员变量,肯定会说这个函数没有声明的,因为没有对象,就不会给成员变量分配空间,所以这种访问是无效的。而函数就不同了。即使没有对象,只要是其内部不进行未分配访问,其函数是可以顺利执行的。

典型的例子:

 effitive C++   p59
    PriorotyCustomer::operator=(const PriorityCustomer &rhs)
    {

Customner::opertator=(rhs);
   ....
   }

非static成员函数通过类名::来调用,空指针调用成员方法不出错!的更多相关文章

  1. C++_static与非static成员(函数)

    static与非static成员(函数)  <C++ Primer>第4版399页: 对于特定类类型的全体对象而言,访问一个全局变量有时是必要的.然而,全局变量会破坏封装:对象需要支持特定 ...

  2. C++中的static数据成员与static成员函数

    本文要点: 1.static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联! aka:每个static数据成 ...

  3. C++类中的static数据成员,static成员函数

    C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在, ...

  4. static成员函数不能调用non-static成员函数

    1 一般类静态成员函数不能调用非静态成员函数 2 static成员函数可以调用构造函数吗? 答案是肯定的,由于static成员函数没有this指针,所以一般static成员函数是不能访问non-sta ...

  5. 为什么const对象只能调用const成员函数,而不能调用非const成员函数?

    在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理. 假设有一个类,名字为test代码如下: clas ...

  6. 怎么在const成员函数里面调用非const成员函数?

    举个例子: 定义了一个类的const实例,怎么让他也能调用非能调用非const成员函数class foo{public:void test1() {cout << "I am n ...

  7. 【编程拾遗】C++的static成员函数与单例模式

    static小结 static的引入 static 是C++中非经常常使用的修饰符,它被用来控制变量的存储方式和可见性. 函数内部定义的变量,在程序运行到它的定义处时,编译器为它在栈上分配空间,函数在 ...

  8. static 成员变量、static 成员函数、类/对象的大小

    一.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量 ...

  9. static成员函数

    1.static成员函数不能定义为const的,这是因为static成员函数只是全局函数的一个形式上的封装,而且static成员函数不能访问类的非静态成员(没有this)指针,修改非静态数据成员又从何 ...

随机推荐

  1. nodemon是个好东西

    不说话,直接上图: 安装 使用

  2. django学习1

    参考资料:http://www.cnblogs.com/feixuelove1009/p/5910384.html#top 本学习只在记录过程,需要更全面的资料,可直接上参考资料细看. django版 ...

  3. Windows2008安装WebSphere 6.1提示此安装程序不能在图形方式中运行

    推荐的解决方式:http://blog.sina.com.cn/s/blog_4b010fb50100n1mk.html 在一般情况下,安装Websphere是直接运行launchpad.exe,然后 ...

  4. python调用ansible接口API执行命令

    python版本:Python 2.6.6 ansible版本:ansible 2.3.1.0      下载地址:https://releases.ansible.com/ansible/ 调用脚本 ...

  5. MySQL中show语法使用总结

    MySQL中 show 语法的使用: 先查看MySQL版本信息: mysql> select version(); +------------+ | version() | +--------- ...

  6. YII2 搭建redis拓展

    安装redis扩展: 1.通过composer进行安装,到项目根目录cmd运行(推荐) php composer.phar require --prefer-dist yiisoft/yii2-red ...

  7. php把数组、字符串 生成文件

    生成的代码 data/ss.php <?php return array ( ', ', ); php代码 $str = "<?php\nreturn \n"; $my ...

  8. SQL随机生成6位数字

    SELECT RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 6)

  9. Android 内存

    memory usage of this progress under 15MB for 1GB RAM device Android内存机制分析下篇:分析APP内存使用情况http://mobile ...

  10. 常见bootloader介绍

    https://blog.csdn.net/weibo1230123/article/details/82716818 http://fasight001.spaces.eepw.com.cn/art ...