自从C++ 11默认生成复制构造函数和复制赋值运算符(存在用户定义的析构函数)时,我遇到了一个问题.
对于大多数足够简单的类,默认生成的构造函数,运算符和析构函数都可以.请考虑以下原因来声明析构函数:
在基类中创建虚拟析构函数虚拟:
// header
class Base1 { public: virtual ~Base1() = default; };
class Base2 { public: virtual ~Base2(); };
// source
Base2::~Base2() = default;
Run Code Online (Sandbox Code Playgroud)
在这些情况下,编译器是否会生成4个复制和移动特殊方法?如果是,那么我认为它很好,没有必要复杂化Base1或Base2.
在析构函数中打印调试消息:
// header
class D { public: ~D(); };
// source
D::~D() {
#ifdef DEBUG_THIS
std::cout << "D was destructed." << std::endl;
#endif
}
Run Code Online (Sandbox Code Playgroud)
我相信在这种情况下会生成复制构造函数和赋值运算符; 但移动构造函数和赋值运算符不会.我想避免使用已弃用的默认生成和禁用复制D.我还想避免D4次deleted声明泛滥.是否仅禁用一个复制构造函数?这是一种好风格吗?
在C++中声明和定义全局常量的最佳方法是什么?我最感兴趣的是C++ 11标准,因为它在这方面做了很多修复.
[编辑(澄清)]:在这个问题中,"全局常量"表示在编译时在任何范围内已知的常量变量或函数.必须可以从多个翻译单元访问全局常量.它不一定是constexpr风格不变-可以是这样const std::map<int, std::string> m = { { 1, "U" }, { 5, "V" } };或const std::map<int, std::string> * mAddr() { return & m; }.在这个问题中,我没有触及优选的好的范围或常数名称.让我们把这些问题留给另一个问题.[END_EDIT]
我想知道所有不同情况的答案,所以让我们假设这T是以下之一:
typedef int T; // 1
typedef long double T; // 2
typedef std::array<char, 1> T; // 3
typedef std::array<long, 1000> T; // 4
typedef std::string T; // 5
typedef QString T; // 6
class T {
// unspecified amount of code
}; // 7
// …Run Code Online (Sandbox Code Playgroud) 我有一个带有通知区域图标的应用程序,因此主窗口可能会忽略关闭事件.我正在尝试保存应用程序退出的首选项和历史记录.我还想在应用程序运行时处理注销.虽然应用程序是跨平台的,但它在GNU/Linux中最方便/最有用,因此Windows注销行为的关注度要低得多.这是一个用于测试不同桌面环境/窗口管理器行为的最小可编译示例:
// main.cpp
# include <QApplication>
# include <QMainWindow>
# include <QCloseEvent>
# include <QTimer>
# include <iostream>
class M : public QMainWindow
{
Q_OBJECT
public:
~M();
public slots:
void onAboutToQuit();
private:
void closeEvent(QCloseEvent *);
};
M::~M()
{
std::cout << "M::~M()" << std::endl;
}
void M::onAboutToQuit()
{
std::cout << "onAboutToQuit()" << std::endl;
}
void M::closeEvent(QCloseEvent * e)
{
std::cout << "closeEvent()" << std::endl;
hide();
QTimer::singleShot(5000, this, SLOT(show()));
e->ignore();
}
int main(int argc, char * argv[])
{
QApplication app(argc, argv);
M …Run Code Online (Sandbox Code Playgroud)