为什么c++中,有时可以用类名直接访问非静态成员函数?
正规的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();
转自:https://segmentfault.com/q/1010000005650649/a-1020000005651548
为什么c++中,有时可以用类名直接访问非静态成员函数?的更多相关文章
- C++ 中静态成员函数访问非静态成员变量的方法
最近在 VS2010 里开发出厂烧写工具,遇到一个问题: 我创建了一个线程,在这个线程里要访问非静态成员,而这个线程函数是静态的.最后找到的办法是用对象指针来做. sourcecode: #test. ...
- [C++基础]C++中静态成员函数如何访问非静态成员
#include <iostream> /* 静态成员函数只能访问静态数据成员.静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可由任意访问许可的函数 ...
- C++类中的静态成员变量与静态成员函数
最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...
- C++类中的静态成员变量和静态成员函数的作用
数据成员可以分为静态变量.非静态变量两种. 静态成员:静态类中的成员加入static 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
- C++中的静态成员函数
1,问完成的需求: 1,统计在程序运行期间某个类的对象数目: 1,静态成员变量满足了这个需求: 2,保证程序的安全性(不能使用全局变量): 3,随时可以获取当前对象的数目: 1,有没有什么特别的地方或 ...
- C++ 中的静态成员函数与静态成员变量
于CSDN 2014-01-17 与静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volu ...
- class中static总结-静态成员函数和静态成员变量
C++规定const静态类成员可以直接初始化,其他非const的静态类成员需要在类声明以外初始化,我们一般选择在类的实现文件中初始化,初始化的方式是书写一遍类型的定义: //A.cpp ); //使用 ...
- C++中static修饰的静态成员函数、静态数据成员
1.静态成员函数.静态数据成员 在类中,用static修饰的成员函数被称为静态成员函数,而用static修饰的数据成员就称为静态数据成员:与普通的成员函数和数据成员不同, 静态成员函数和静态数据成员有 ...
- java字段中初始化的规律与如何用静态成员函数调用非静态成员
java字段中初始化的规律: 执行以下代码,出现的结果是什么? class InitializeBlockClass{ { field=200; } public int field=100; pub ...
随机推荐
- 【Unity】12.1 基本概念
开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 导航网格(Navmesh)是世界坐标系中几何体的简化表示,被游戏代理用来进行全局导航.通常,代 ...
- MyEclipse中设置jsp页面为默认utf-8编码
转自:http://www.cnblogs.com/xdp-gacl/p/3496161.html 在MyEclispe中创建Jsp页面,Jsp页面的默认编码是“ISO-8859-1”,如下图所示: ...
- Boost家族
大师Yoav Freund在文章<A decision-theoretic generalization of on-line leanring and an application to bo ...
- HTML5学习笔记(二):HTML基础学习之二
表单 表单用来传递用户数据,多用来与后端进行数据交互. 前端: <!DOCTYPE html> <html lang="en"> <head> ...
- 菜鸟学SSH(一)——Struts实现简单登录(附源码)
从今天开始,一起跟各位聊聊java的三大框架——SSH.先从Struts开始说起,Struts对MVC进行了很好的封装,使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时 ...
- Dynamic Control Flow in ML
https://arxiv.org/abs/1805.01772 https://www.leiphone.com/news/201702/cb7cPOtzFj1pgRpk.html
- pandas数组(pandas Series)-(2)
pandas Series 比 numpy array 要强大很多,体现在很多方面 首先, pandas Series 有一些方法,比如: describe 方法可以给出 Series 的一些分析数据 ...
- DBeaver利用方式简介
当攻击者能够进入内网,同时发现某台服务器装有弱口令的数据库时,除了在console中查看数据库信息外, 还可以利用第三方工具进行数据库读取,本例中使用DBeaver进行查看. 1. 下载DBeaver ...
- vue.js中请求数据v-for循环使用数据
1.效果图 2.cart.json { "message":"", "status":"1", "result ...
- CSS实现:标题两侧画线效果
如图: html代码: <div class="detail-news"> <h5 class="detail-news-title"> ...