在C ++中,为什么指针指定了nullptr调用成员函数?我期望函数在调用时会出错,因为指针没有指向生成类实例的内存区域。
我尝试的代码如下:
[/c]$ cat n.txt
10
11
12 a this is spaced line
13
14a
16 this is tab line
[/c]$ awk -F" " '{if ($1 ~ /[02468]$/ && $1 % 2 == 0) print $0}' n.txt
10
12 a this is spaced line
16 this is tab line
[/c]$ awk -F" " '{if ($1 ~ /[02468]$/ && $1 % 2 == 0) print gensub($1,"blah", 1); else print $0;}' n.txt
blah
11
blah a this is spaced line
13
14a
blah this is tab line
输出:
chrome://flags/#enable-webvr
环境:
#include <iostream>
class Foo
{
public:
int var = 10;
void func();
};
void Foo::func() {
std::cout << "func() function called." << std::endl;
}
int main(int argc, char const* argv[])
{
Foo foo;
Foo* foo_ptr = (Foo*) nullptr;
// std::cout << foo_ptr->var << std::endl; // segmentation fault
foo_ptr->func(); // Output: "func() function called." WHY??
foo_ptr = &foo;
std::cout << foo_ptr->var << std::endl; // Output: 10
foo_ptr->func(); // Output: "func() function called."
return 0;
}
答案 0 :(得分:3)
C ++成员函数具有隐式this
参数。在你的例子中,它好像你写了:
class Foo
{
public:
int var = 10;
static void func(Foo* this);
};
然后您通过以下方式调用它:
Foo* foo_ptr = nullptr;
Foo::func(foo_ptr);
一切都会好的。
由于您的函数不使用this
,因此它的null不会阻止它工作。但这并不能使代码合法 - 只要你取消引用空指针就调用了未定义的行为,正如你在这里所做的那样:
foo_ptr->
因此,虽然您的代码似乎有效,但它不是有效的C ++。如果你想要类似于你的代码是有效的,你可以使用上面的公式,静态成员函数采用明确的this
(你可以命名你想要的任何东西,当然 - 只有常规的隐式{{ 1}}有一个固定的名称)。
当使用带有隐式this
的常规C ++成员函数时,this
是有效对象的前提条件,而不是null。否则呼叫无效。但是,许多实现没有强制机制来检查这一点,因此您看到的代码即使无效也似乎有效。