• 静态函数
  • c++
xxdd11223 2016年06月05日提问

  • 关注 4 关注
  • 收藏 0 收藏,1.7k 浏览
问题对人有帮助,内容完整,我也想知道答案 0 问题没有实际价值,缺少关键内容,没有改进余地

如题,看到一篇文章,说只要非静态成员函数中没有使用非静态成员变量,就可以通过类名和域运算符来直接调用非静态成员函数,而不需要实例来调用,是这样吗?
编译器为vs2013

  • 2016年06月05日提问
  • 评论
  • 邀请回答
  • 编辑

默认排序时间排序

3个回答

答案对人有帮助,有参考价值 3 答案没帮助,是错误的答案,答非所问

正规的C++语言标准目前(截止到C++14)应该还不支持这种调用方法。
目前微软似乎在它的VC++中推行一种叫做C++/CLI的标准,有可能会支持这种调用,如果一定要用这种调用方法的话,还应该用VS2013尝试编译运行一下。

实际上,C++语言中类的静态成员函数本身应该是所有这一类对象的集体所具有的行为,就是说,不是某一个对象能够具有或者说实现的;而非静态成员函数应该是某一个对象自己的动作行为,跟本类其他对象乃至整个类关系不大,是对象依靠自己的数据以及函数参数就可以完成的行为。
根据以上的讨论,我们可以看出,很难存在一种需求,使得一个成员函数不需要引用本对象的非静态成员,同时又必须是一个对象自己的行为(即声明为非静态成员函数)。如果真的存在不引用非静态成员的成员函数,那还是直接声明为静态成员函数为好,这样就可以万无一失地通过编译,也避免了移植性问题。

说句题外话,非静态成员函数总会有一个隐含的参数,就是this指针。通过反汇编分析也可以发现,非静态成员函数的调用属于特殊的thiscall,就是说总会传入一个this指针。而静态成员函数和类外的函数一样,经过编译后都是普通的调用,不会得到this指针,因此也不可能访问非静态成员(因为非静态成员的引用总是通过this指针完成的)。因此一个函数能否通过类名调用,主要还是要看它是否需要编译器传入this指针(要看编译后的代码,源代码级别上的调用是看不到传入的this指针的)。

如果真的希望在没有实例的前提下,调用一个非静态成员函数,可以使用下面的方法(前提是必须符合您提出的那个条件,即不访问任何非静态成员,如果它访问了非静态成员,则可能导致内存读写异常):

// 假设要引用的类类型为 TargetType, 成员函数为 void TargetType::TargetFunc();
// C++11 版:
static_cast<TargetType *>(nullptr)->TargetFunc();
// C++98/03 版:
reinterpret_cast<TargetType *>(0)->TargetFunc();
// 如果使用 C 风格的类型转换操作符:
((TargetType *) 0)->TargetFunc();

  • 2016年06月05日回答
  • 2 评论
  • 编辑
krantz72 声望

答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

类名可以访问非静态成员才怪了,那我怎么区分访问的是哪个对象的非静态?静态可以理解为,所有用该类创建的对象都共享的变量。

  • 2016年06月06日回答
  • 1 评论
  • 编辑
jinsongzhao35 声望

答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

只要非静态成员函数中没有使用非静态成员变量

这句话的意思是non-static member function里面没有对this指针的调用,没有调用this的non-static member function其实和static member差不了太多的。

你可以先把一个nullptr转换成对应的class类型,再调用这个non-static memrber function,如下所示:

class A {
public:void printHello() {cout << "hello" << endl;}
};void test() {A *p = nullptr;p.printHello();
}

c++中,可以用类名直接访问非静态成员函数?相关推荐

  1. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  2. 类中的静态成员函数访问非静态成员变量

    http://blog.csdn.net/u011857683/article/details/52294353 1.思路: 静态成员函数属于类(通过类访问,调用函数时没有提供this指针), 非静态 ...

  3. c语言非静态成员引用方式,C++中静态成员函数访问非静态成员的实例

    C++中静态成员函数访问非静态成员的实例 实现代码: #include /* 静态成员函数只能访问静态数据成员.静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可 ...

  4. C++静态成员函数访问非静态成员的几种方法

    大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会"自动"帮你把这个this指针加到函数形参里去.当然在C++灵活性下面,类还 ...

  5. 为什么C++静态static函数不能访问非静态成员

    原因如下: 1. 静态static成员函数不同于非静态函数,它只属于类本身,而不属于每一个对象实例.静态函数随着类的加载而独立存在.与之相反的是非静态成员,他们当且仅当实例化对象之后才存在.也就是说, ...

  6. C++中静态成员函数和非静态成员函数的区别

    它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this. 例如: 1 class Sc 2 { 3 public: 4 void nsfn(int a); / ...

  7. qt 静态成员变量_Qt 静态成员函数的调用非静态成员变量,非静态成员函数

    在多人开发的项目中,一些通用的工具类接口可以用静态成员函数.方便调用,并且不容易调用错误. 静态成员函数不传递this指针(不能->),不识别对象个体,所以经常用于对静态数据成员进行操作.不能操 ...

  8. 非静态成员函数的非法调用错误

    1 静态成员函数相当于全局函数,只有一个类名字空间的限制.静态成员函数是类的函数,无需指明是某个实例对象在操作,既可以是类在调用其静态成员函数也可以是其实例对象来调用.注:静态成员函数只能访问静态成员 ...

  9. C++ 实现把非静态成员函数作为回调函数(非static)

    众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它. 通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静态成员函数,但这样 ...

最新文章

  1. Android接口初了解
  2. 设置VMware随系统开机自动启动并引导虚拟机操作系统
  3. 《JavaScript启示录》——导读
  4. 【干货】2014年值得仔细研究的十大神级文案
  5. 报名|腾讯技术开放日·5G技术专场
  6. when component is created twice - still no hint finally
  7. win8系统配置服务器地址,win8系统默认服务器地址
  8. java匿名类 - new接口
  9. DORADO实现动态拼装查询条件
  10. 为什么双重检查锁模式需要 volatile ?
  11. PHP sql IN查询改成子查询
  12. SQL导出excel数据
  13. HackerRank笔记 - SQL Server
  14. 南航考研计算机学院学硕分数,2019南航计算机我考上啦!
  15. 转:中文汉字占二个字节还是三个字节长度
  16. ae怎么输入竖排文字? ae文字竖排的方法
  17. VMware 虚拟机 linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask) UP BROADCAST MULTICAST 问题
  18. 物联网无线通信技术蓝牙、wifi、zigbee
  19. 5款国产ARM芯片(对标stm32f103c8t6)测试评估
  20. POI生成Excel

热门文章

  1. java实现可视化报表_如何在Power BI中记录报表可视化?
  2. ajax put请求_前端基础面试:手写一个ajax,说说XMLHttpRequest 都有哪些属性?
  3. linux 开发组织模式,Linux内核发布模式与开发组织模式(1)
  4. 台达b2伺服说明书_三菱Q系列定位模块及伺服参数不会设置?看这一篇就够了!...
  5. windows获取硬件设备的guid_Windows编程技术:提权技术(下)
  6. srwebsocket 服务器过段时间会关闭_Minecraft 开启服务器后必须做的一些事情
  7. verilog中function用法_verilog中的function用法与例子
  8. python dict函数key_python的dict判断key是否存在的方法
  9. python如何控制浏览器_控制使用Python浏览器?
  10. 高压电是以交流,还是直流方式输送?