雄安专业网站建设公司,如何做好电商,有没有做家具特卖的网站,如何诚信网站平台建设今天遇到一道不错的题目#xff0c;主要讲了c11对nullptr的特性。 首先#xff1a;nullptr 是C11引入的一个关键字#xff0c;用于表示“空指针常量”#xff0c;它是类型std::nullptr_t的唯一值。nullptr 的引入解决了C语言风格的空指针字面量#xff08;如NULL或0#…今天遇到一道不错的题目主要讲了c11对nullptr的特性。 首先nullptr 是C11引入的一个关键字用于表示“空指针常量”它是类型std::nullptr_t的唯一值。nullptr 的引入解决了C语言风格的空指针字面量如NULL或0在C中的一些问题和不一致性提供了更安全、更清晰的空指针表示。
示例1
#includeiostream
struct A
{void func();
};
void A:: func()
{std::cout hello worldstd::endl;
}
int main()
{A * a nullptr;a-func();return 0;
}
请问上面的代码编译怎怎样运行怎样 答案正常编译运行输出 hello world。 为什么呢 这段代码中将指针a初始化为nullptr并在之后调用了a的成员函数func()。正常情况下这样的代码会导致空指针解引用错误因为a指向了空的内存地址。 然而在这个特定情况下虽然a是空指针但是func()函数在执行时并没有使用到a指针的任何成员变量或函数所以没有导致错误。因此代码能够正常执行并输出hello world。 示例2
#includeiostreamclass A
{void func();
};void A:: func()
{std::cout hello worldstd::endl;
}int main()
{A * a nullptr;a-func();return 0;
}
我们将struct改为class会怎样呢因为默认类默认是私有的所以编译就会报错。只要我们将类型改为公有就可以正常编译且运行了 示例3
在这里插入#includeiostreamclass A
{public:virtual void func();
};void A:: func()
{std::cout hello worldstd::endl;
}int main()
{A * a nullptr;a-func();return 0;
}
代码片那么这样呢将func声明未虚函数呢能否编译成功运行 答案可以编译运行的时候会core dumped。原因是正是出现在了虚函数上面。 当我们定义一个类的成员函数为虚函数时会通过虚函数表和函数指针维护这个虚函数。
当我们通过基类指针或引用调用虚函数时实际上是通过以下步骤进行的 1、获取对象的虚函数指针。 2、通过虚函数指针找到对应的虚函数表。 3、在虚函数表中查找对应虚函数的函数指针。 4、调用找到的函数指针所指向的函数。
回归到这个题。 func()是一个虚函数虚函数机制只会在你尝试通过基类指针调用派生类中的函数时生效但它不能防止你对空指针进行操作。
在你尝试调用a-func()时编译器会尝试获取a指向的对象的虚函数表然后从虚函数表中查找func()函数的地址并调用它。但是因为a是nullptr所以编译器无法获取到虚函数表于是导致了崩溃。