跳到主要内容

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​,函数的默认参数是一个匿名函数的调用返回值,匿名函数中包含静态变量。#匿名函数#​