为什么可以在没有对象实例的情况下调用非静态成员函数
Why is possible to call nonstatic member-function without an object instance?
可能重复:
当我在NULL对象指针上调用成员函数时会发生什么?
我认为这个代码和程序输出可以自我解释:
#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
void Not_Static(string args)
{
cout << args << endl;
}
};
int main()
{
Test* Not_An_instance = nullptr;
Not_An_instance->Not_Static("Non-static function called with no object?");
cin.ignore();
return 0;
}
程序输出:
在没有对象的情况下调用非静态函数?
为什么这是可能的?
未定义的行为。您的程序通过调用空指针上的方法来调用未定义的行为,因此所有内容都是允许的,包括您的输出。
请记住:C++语言的规范并没有指定每一个可能的程序的输出,从而为优化留出空间。许多事情没有明确检查,可能会导致看似不正确或不合逻辑的行为,但只是未指明。
此行为未定义,因此很可能会打印该输出。问题是,不明确的行为很容易咬到你,所以你不应该做这样的事。
因为它不使用this
,因此不取消引用空指针。让它成为虚拟的,它很可能会失败。
相关文章:
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- C++ - 如何在不调用其属性的情况下调用类?
- C++ 在不释放内存的情况下调用析构函数
- Python在不引用类名的情况下调用类函数
- 为什么在这种情况下调用非常量右值移动构造函数?
- 是否可以在没有显式专用化的情况下调用可变参数模板函数?
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 您可以在不调用构造函数的情况下调用攻击器吗?
- 命名空间:不能在没有对象的情况下调用成员函数
- 哪些语言将在没有显式桥接的情况下调用C++
- 如何在不重新索引顶点的情况下调用"boost::remove_vertex"?
- C :在没有对象实例的情况下调用非静态成员函数
- 在不实例化的情况下调用不同派生类的虚拟方法
- C 如何在没有错误的情况下调用void函数
- 在MSVC上的数组初始化期间,destructor在不复制或移动构造方的情况下调用
- 在不指定实例化的情况下调用类模板的静态方法的方法
- 为什么INVOKE总是取消引用数据成员,而不是在可能的情况下调用
- 是否可以在不实例化派生类的情况下调用该类的虚拟函数
- 无法在没有对象的情况下调用成员函数(尽管我相信我确实初始化了它)
- 为什么在没有赋值运算符的情况下调用转换构造函数