C++ Quiz 笔记
17
#include <iostream>
class A
{
public:
A() { std::cout << 'a'; }
~A() { std::cout << 'A'; }
};
class B : public A
{
public:
B() { std::cout << 'b'; }
~B() { std::cout << 'B'; }
};
int main() { B b; }
答案是 abBA,没太多好说的,就是继承的构造和析构顺序。#构造函数# #析构函数# #面向对象#
120
#include <iostream>
int main() {
int a = 10;
int b = 20;
int x;
x = a, b;
std::cout << x;
}
答案是 10,这个 , 是逗号表达式,整体的 ; 的表达式返回的是 , 的最后一条,例如用 y = (x = a, b); 获取,y 值会是 20。这个特性 C 语言也存在。这个特性目前只在只能放一条完整表达式的地方见过,比如 if 的条件。在《C 专家变成》2.3.2 也有相关讨论。
279
#include <iostream>
#include <variant>
struct C
{
C() : i(1) {}
int i;`
};
struct D
{
D() : i(2) {}
int i;
};
int main()
{
const std::variant<C, D> v;
std::visit([](const auto &val)
{ std::cout << val.i; }, v);
}
答案是 1,variant 联合体的默认构造函数调用的是第一个成员的构造函数。#variant#
289
#include <iostream>
void f(int a = []()
{ static int b = 1; return b++; }())
{
std::cout << a;
}
int main()
{
f();
f();
}
答案是 12,函数的默认参数是一个匿名函数的调用返回值,匿名函数中包含静态变量。#匿名函数#