水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:[讨论][求助]为什么这段代码可以执行并且正常输出hello
楼主
|
horkoson
|
2024-03-02 23:35:37
|
只看此ID
class Test
{
public:
void hello() {
printf("hello\n");
}
};
int main()
{
Test *p = nullptr;
p->hello();
return 0;
}
--
FROM 175.153.160.*
1楼
|
dormouseBHU
|
2024-03-03 10:08:43
|
只看此ID
p->hello(); 实际会被翻译成 hello(p) p 又没有被用到,所以能正常执行。
【 在 horkoson 的大作中提到: 】
: class Test
: {
: public:
: ...................
--
FROM 123.113.227.*
2楼
|
horkoson
|
2024-03-03 21:59:51
|
只看此ID
【 在 dormouseBHU 的大作中提到: 】
: p->hello(); 实际会被翻译成 hello(p) p 又没有被用到,所以能正常执行。
:
:
--
FROM 175.153.160.*
3楼
|
z16166
|
2024-03-04 10:26:58
|
只看此ID
non-virtual的成员函数的地址是编译期就知道的,不需要通过this去访问其地址就能直接call,所以this是nullptr也没关系。
virtual的成员函数,以及non-static的成员变量才需要通过this指针去访问,这些情况下this不能是nullptr。
但是,通过nullptr的this来调用成员函数属于Undefined Behavior
--
FROM 123.119.160.*
4楼
|
jingyou
|
2024-03-04 11:22:42
|
只看此ID
长见识了
--
FROM 223.108.201.*
5楼
|
horkoson
|
2024-03-04 22:05:47
|
只看此ID
【 在 z16166 的大作中提到: 】
: non-virtual的成员函数的地址是编译期就知道的,不需要通过this去访问其地址就能直接call,所以this是nullptr也没关系。
: virtual的成员函数,以及non-static的成员变量才需要通过this指针去访问,这些情况下this不能是nullptr。
: 但是,通过nullptr的this来调用成员函数属于Undefined Behavior
俞飞鸿C++大佬
--
FROM 175.153.160.*
6楼
|
Bernstein
|
2024-03-05 00:30:08
|
只看此ID
这个hello本质上是个static函数,其内部没有引用类的成员,单单在调用hello时把p压栈是不会引发异常的
【 在 horkoson 的大作中提到: 】
: class Test
: {
: public:
: ...................
--
FROM 123.112.20.*
7楼
|
qzyanyuan
|
2024-03-05 08:51:53
|
只看此ID
用反汇编工具可以发现class里面函数地址是在全局函数指针表里面的不是局部的。
【 在 z16166 的大作中提到: 】
: non-virtual的成员函数的地址是编译期就知道的,不需要通过this去访问其地址就能直接call,所以this是nullptr也没关系。
: virtual的成员函数,以及non-static的成员变量才需要通过this指针去访问,这些情况下this不能是nullptr。
: 但是,通过nullptr的this来调用成员函数属于Undefined Behavior
: ...................
--
FROM 114.221.22.*
8楼
|
z16166
|
2024-03-05 14:07:16
|
只看此ID
是的,说asm无用的可以休矣
【 在 qzyanyuan 的大作中提到: 】
: 用反汇编工具可以发现class里面函数地址是在全局函数指针表里面的不是局部的。
:
--
FROM 123.119.160.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版