为什么指针指定了nullptr调用成员函数?

时间:2017-07-23 03:24:49

标签: c++ pointers

在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;
}

1 个答案:

答案 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。否则呼叫无效。但是,许多实现没有强制机制来检查这一点,因此您看到的代码即使无效也似乎有效。