空指针也能调用成员函数?

C++调用空指针对象的成员函数——静态绑定与动态绑定 最近代码中看到调用空指针对象的成员函数的写法,联想起上次碰到的问题:C++成员函数存储方式(是否属于的对象)两者的本质是一样的,上次只是简单地讨论了下,这次从编译器的角度,来谈一谈这个知识点。一个简单的例子:class MyClass { public: int i; void hello() { printf("hello\n" 阅读详情

    最近各大公司都在招聘实习生,昨晚,微信公众号推送了网易的笔试题让小伙伴们参考,看了第一道题,博主就觉得“嗯,我果然还是见识短哈!”为什么呢,我们先看看这个代码~

class cal
{
public:
	void show()
	{
		cout << "cal::Show()" << endl;
	}

};
int main()
{
	cal *pcal = NULL;
	pcal->show();
	getchar();
	return 0;
}
#endif

Q;该程序输出的结果什么?

博主毫不犹豫的选择了“运行时崩溃”这个选项

然而。。。。真正的答案却是这个指针可以正确的调用show()函数。。what?!why?!这不科学

怀着对科学严谨的态度(我要吐了)B_0061.gif,博主还是去别的大大的博客转了一圈。诶!?还真被我找到了,这到底是为什么呢?

我们现在再看一段代码!

class cal
{
public:
	cal() :a(10)
	{}
	void display()
	{
		cout << a << endl;
	}
private:
	int a;
};
int main()
{
	cal *pcal = NULL;
	pcal->display();
	getchar();
	return 0;
}
#endif

和上面的那段代码很像吧,但是呢,这段代码在运行的时候是会崩溃的,为什么呢!?

    仔细的你发现了没,上面第一段代码里,指针调用的函数没有用到this指针,而这一段里用到了,所以关键就在于你是否用到了this指针。

    这是因为,我们在编写一个类的时候,它的所有的对象共用了成员函数,所以在编译期间我们就已经确定了成员函数的地址,而类又依靠this指针来区分各个不同的对象以便于找到正确的数据。对于第一个例子,它的this指针就等于NULL而show()是一个静态类型的成员函数,在调用时不会传this指针给它,所以我们可以顺利的调用它,但是第二个例子中我们用到了类的数据a在调用时被编译器解释为this->a ,但是你得this是NULL啊,你指什么啊!?

    所以,你明白了吗。。。

本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1755456

使用electron静默打印 使用electron静默打印 1.使用electron打印的理由 很多情况下程序中使用的打印都是用户无感知的。并且想要灵活的控制打印内容,往往需要借助打印机给我们提供的api再进行开发,这种开发方式非常繁琐,并且开发难度较大。 electron提供的打印api可以非常灵活的控制打印设置的显示,并且可以通过html来书写打印内容。 2.api ele... 阅读详情

相关推荐

基于51单片机的电压表【0-20V,ADC0832,4051,自动量程】(仿真)

自动换挡式数字电压表就是一个基于单片机的能自动切换量程的数字电压表,其作用是在使用低位的AD转换实现高精度电压测量,可以测量0~20V的电压,并且具有0~0.2V(待测电玉低于0.2V时),0~2V(待测电压低于2V时)和0~20V三个量程自动匹配测量,当待测电压值发生变化时,电压表可以根据输入电压情况自动选择合适的量程进行测量,并且把测量结果显示出来。(2)实现电压表精度测试,最高精度要求0.01V;(1)实现0~20V分3档式电压表;

qq_63964231的博客 1466

C++ 空指针访问成员函数

我们知道 this指针 指向的是调用成员函数的对象,然而我们并没有创建对象,而是创建了一个可以指向对象的指针p,那么 this指针 的指向就会等于 p指针 的指向,也就是空。一个空指针,怎么能有 this -> m_age 这样的操作呢?成员函数(非静态)都隐含了this指针,而 func_2( )内部调用了成员变量,所以实际上它内部的代码应该是这样的:cout << this -> m_age << endl;2、但若调用成员函数使用了this指针(即函数内部调用了成员变量),就会出错。

Mo3328679412的博客 954

Cox构建预测模型(5):如何用R语言绘制校准曲线(附全套代码)

这篇文献通过绘制两个模型的DCA曲线来评估模型的临床决策实际需求,一个是列线图模型,包括纳入列线图的全部变量,一个是TNM模型,只纳入TNM分期3个变量。A图是训练集1年、3年、5年患者的总生存期的DCA曲线;B图是训练集1年、3年、5年患者的总生存期的DCA曲线,红色线条代表列线图模型(包括构建模型的10个变量),黄色线条代表TNM模型(仅纳入TNM分期3个变量),两个模型对比,在绘制校准图之前,必须要完成数据的导入、拆分数据集的工作、预测因子的筛选,校准图的绘制是分别在训练集与验证集独立进行的。

qq_37610365的博客 1343

和对象(7)--空指针访问成员函数

和对象--空指针访问成员函数1 空指针访问成员函数 1 空指针访问成员函数 如果成员函数中没有用到this指针,可以用空指针调用成员函数 如果成员函数中用到了this(访问了其成员变量),那么这个this需要加判断,防止代码down掉(如下方代码注释一) #include <iostream> using namespace std; class Person { public: void showPerson() { cout <<

linuxcpp_的博客 386

C++空指针调用函数

在C++中是允许空指针调用函数的,但是在我们使用空指针调用成员函数的时候,一定要注意有没有用到this指针如果用到了this指针要加以判断以保证程序的健壮性。 例如以下程序 class Person { public: void Print() { cout << "I'm LiHua." << endl; } void getfd() { cout <...

一颗牙疼 1277

空指针(nullptr)为什么可以调用成员函数

空指针(nullptr)为什么可以调用成员函数

challenglistic的博客 976

C++与对象笔记九:空指针对象调用成员函数

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针。 //空指针访问成员函数 class Person { public: void ShowClassName() { cout << "我是Person!" << endl; } void ShowPerson() { if (this == NULL) { return; } cout << mAge << endl; } public: .

xiaoyaolangwj的博客 891

【C++】空指针调用成员函数及访问成员变量

最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q4/20201231。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序

Yngz_Miao的博客 1万+

C++空指针调用成员函数

如果在C++里用空指针调用成员函数会发生什么情况呢? 以下面为例 class A { private: int a=100; public: void Show() { cout << "This is A" << endl; } void GetA() { cout << a << endl; } void SetA...

柴犬小丸子的博客 440

空指针可以调用成员函数

有下面一个简单:class A { public: void fun(){ cout << "I'm class A"<<endl; } };用一个空指针调用上面的fun函数:A* pa = NULL; pa->fun();讲道理,空指针应当是”不可用”的,自然也不能调用成员函数了,但是结果却出乎意料地正确执行了: 为什么??其实,关键在于每个成员函数的this

_wings的博客 2954

空指针为什么能调用成员函数

举个简单的例子,假如有如下的一段代码: class MyClass { public:     int i;     void hello()     {         printf("hello\n");     }     void print()     {         printf("%d\n", i);     } }; void main() {

wang73ying的专栏 642

不报错地调用空指针成员函数

究竟什么原因使得空指针实例调用成员函数也能正常运行?

Qt君 606

使用空指针对象调用成员函数

使用空指针对象调用成员函数的不同情况

choumin的专栏 172

空指针调用成员函数的场景

当对一个空指针调用成员函数时,this指针的值为nullptr。printName函数需要通过this指针查找name成员,但是此时this==nullptr,无法定位和访问name变量,因此会出错。C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针,如果用到this指针,需要加以判断保证代码的健壮性。原因在于成员函数隐含地通过this指针来访问对象,如果this指针为空,就无法正常完成成员函数的执行。空指针可以调用成员函数,但是如果成员函数中用到了this指针就不可以了,为什么?

qq_45030264的博客 530

空指针调用成员函数

话不多说,来看看下面这段代码 Person设计(包含在Person.h头文件中) #pragma once #include<iostream> #include<cstring> using namespace std; class Person { private: string name; // 姓名 string gender; // 性别 int age; // 年龄 public: void showClassName(); void showPe

xxh20188345的博客 420

空指针调用C++成员函数的奥秘

这段C++代码展示了空指针调用成员函数行为差异。定义了两个A和B,都包含Print()方法,但B的方法会访问成员变量。测试显示:空指针t1调用A::Print()能正常运行,因为不访问成员变量;而t2若为空指针调用B::Print()会崩溃,因为需要访问成员数据。关键点在于:空指针调用不访问成员的非虚函数是安全的,但访问成员变量会因解引用空指针而崩溃。动态分配的对象则可正常调用所有方法。

2301_81451531的博客 254

空指针调用非虚成员函数和虚函数

        先来看下面这段代码: class A { private: int data; public: void fun1() { } virtual void fun2(){ } }; int main() { A *p = nullptr; p->fun1(); p->fun2(); }         p是空指针,fun1()是普通成员函数,fun2(

WYuan的博客 2405

c++中使用空指针调用成员函数的理解

使用空指针调用成员函数会如何? 举个例子:base是基,里面有两个函数:non-virtual func2 以及 virtual func1; derived是派生,使用public继承自base,里面有四个函数:virtual func1,non-virtual func3,non-virtual func4以及static non-virtual func5,特别注意:func4调用了...

yhcuac 3174

空指针为什么能调用成员函数?(转载)

发现了一个空指针调用函数成功的例子,很奇怪就查了一下资料,如下: 举个简单的例子,假如有如下的一段代码: class MyClass { public: int i; void hello() { printf("hello\n"); } void print() { printf("%d\n", i);

天地蜉蝣 2749
上一篇: 利用栈实现逆波兰算法
下一篇: Somethings About 《c++编程思想》
Monamokia
博客等级 码龄10年 4粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值