问:以下代码能否运行,为什么?※
#include <stdio.h>
class A
{
public:
void doSome()
{
printf("doSome\n");
}
};
int main()
{
A* a = nullptr;
a->doSome();
return 0;
}答:可以,这里看似A是空的,调用doSome会崩溃,实际上非虚成员函数是编译期静态绑定,调用时仅传递 nullptr 作为 this 指针,而doSome内部未访问 this 指针,无空指针解引用操作。牢记两个崩溃边界:
- 非虚成员函数内部访问 this 指针(如访问成员变量),调用 nullptr 会崩;
- 虚成员函数无论是否访问 this 指针,调用 nullptr 都会崩(依赖虚函数表,需解引用)。
问:以下代码返回值是什么※
const char* roster1[] = { "Alice", "Bob", "Charlie" };
const char* roster2[] = { "Alice", "Bob", "Charlie" };
bool isEqual = std::equal(std::begin(roster1), std::end(roster1), std::begin(roster2));答:返回值取决于编译器优化,默认情况下,MSVC和GCC会把相同字面量的值给合并了,也就是此时roster1和roster2实际上是同一片地址,equal对于这种指针类型的数据实际上比较的是地址,因此此时isEqual为true,但是关掉优化后,它们的地址就不一样了,返回值自然是false。