#include <iostream>
struct A { ~A(); };
A::~A() {
std::cout << "Destructor was called!" << std::endl;
}
typedef A AB;
int main() {
AB x;
x.AB::~AB(); // Why does this work?
x.AB::~A();
}
Run Code Online (Sandbox Code Playgroud)
上述程序的输出是:
Destructor was called!
Destructor was called!
Destructor was called!
Run Code Online (Sandbox Code Playgroud)
我假设前两行属于用户析构函数调用,而第三行是由于在退出main函数范围时调用析构函数.
根据我的理解,typedef是类型的别名.在这种情况下AB是别名A.
为什么这也适用于析构函数的名称?非常感谢对语言规范的引用.
编辑:这是在macOS High Sierra版本10.13.3上使用Apple LLVM版本9.1.0(clang-902.0.39.1)编译的.
什么是声明的返回值/类型int i = 5?
为什么不编译这段代码:
#include <iostream>
void foo(void) {
std::cout << "Hello";
}
int main()
{
int i = 0;
for(foo(); (int i = 5)==5 ; ++i)std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)
虽然这样做
#include <iostream>
void foo(void) {
std::cout << "Hello";
}
int main()
{
int i = 0;
for(foo(); int i = 5; ++i)std::cout << i;
}
Run Code Online (Sandbox Code Playgroud) 特别是在使用 STMF4xx/F7xx 等“更快”的设备时,我们需要根据电源电压和系统时钟频率指定闪存等待周期数。
当 CPU 获取指令/或常量时,这是通过 FLITF 完成的。我的假设是否正确,即 FLITF 只要能够提供所请求的数据,就会保留 CPU 请求,从而使其他总线主控器无法同时访问闪存。
如果这是真的,为什么了解闪存等待周期对于任何接口来说都很重要。就像缓存一样,它会预加载指令,如果它知道要等待多长时间,那么它是独立的,不是吗?
enum class PARAM_TYPE_ {INT_};
enum class PARAM_NAME_ {NAME_};
typedef std::pair<PARAM_NAME_,PARAM_TYPE_> PARAM_;
static constexpr std::unordered_set<PARAM_> params_ {
PARAM_(PARAM_NAME_::NAME_,PARAM_TYPE_::STRING_)
};
Run Code Online (Sandbox Code Playgroud)
为什么不能把它放在我的类头文件中?
我试了很长时间才弄清楚为什么不可能使用以下组合:
static,constexpr,非文字类型
但是我的整体c ++知识太有限了.
我想编写一个类模板,它能够容纳不同的类型。但是,我想避免类型char*或的专业化char[]。字符串应始终为std::string. 下面的代码是我到目前为止所拥有的。然而,写作Scalar("hello")产生T = char[6]而不是产生T = std::string。我可以写Scalar<std::string>("hello")或Scalar(std::string("hello"))解决这个问题。我的问题是,有没有一种方法可以修改下面的代码,使编写Scalar("hello")工作按预期进行,并且该类仍然只有一个模板参数?
template <typename T>
class Scalar {
public:
explicit Scalar(const T& val);
};
Run Code Online (Sandbox Code Playgroud) 我想编写一个类家族,它们在被破坏时在某些条件下创建自身的副本。请看下面的代码
#include <string>
#include <iostream>
bool destruct = false;
class Base;
Base* copy;
class Base {
public:
virtual ~Base() {
if (!destruct) {
destruct = true;
copy = nullptr; /* How to modify this line? */
std::cout << "Copying" << std::endl;
} else {
std::cout << "Destructing" << std::endl;
}
}
};
class Derived : public Base {
public:
Derived(const std::string& name) : name(name) {}
std::string name;
};
int main() {
{ Derived d("hello"); }
std::cout << dynamic_cast<Derived*>(copy)->name << std::endl; …Run Code Online (Sandbox Code Playgroud) 我有一个 long 设置了一个位,我需要知道它是哪个,例如索引。我需要尽快计算出来。天真的想法是除以 2 并检查结果是否为 1。但这最多需要 63 次迭代(最坏的情况)。
我的下一个想法是进行二分查找,例如查看它是 63-32 位还是 31-0 位,然后是 63 - 48、47 - 31、31 - 16、15 - 0 等等,有很多 if-else 语句,但这给了我一堆代码......
此外,我想尽量减少对象的创建和使用的内存。您可能会认为我对 Java 的看法是错误的,应该使用 C/C++。嗯,这是为了学校比赛,我别无选择:)
我想看一些示例代码!
给出以下代码:
class A {
enum class B {
Member
};
struct C {
};
};
Run Code Online (Sandbox Code Playgroud)
如何定义允许我以B::Memberas 身份访问的类型别名C::B::Member?
c++ ×6
alias ×1
c++11 ×1
cortex-m ×1
declaration ×1
destructor ×1
enums ×1
for-loop ×1
inheritance ×1
java ×1
optimization ×1
performance ×1
stm32 ×1
templates ×1
typedef ×1