我最初发布这个只是关于析构函数的问题,但现在我正在添加对默认构造函数的考虑.这是原始问题:
如果我想给我的类一个虚拟的析构函数,但是与编译器生成的析构函数相同,我可以使用
=default
:Run Code Online (Sandbox Code Playgroud)class Widget { public: virtual ~Widget() = default; };
但似乎我可以通过使用空定义减少输入来获得相同的效果:
Run Code Online (Sandbox Code Playgroud)class Widget { public: virtual ~Widget() {} };
这两种定义的行为方式有何不同?
根据此问题的回复,默认构造函数的情况似乎相似.鉴于析构函数的" =default
"和" {}
"之间的含义几乎没有差异,默认构造函数的这些选项之间的含义几乎没有差别吗?也就是说,假设我想创建一个类型,其中该类型的对象将被创建和销毁,为什么我要说
Widget() = default;
Run Code Online (Sandbox Code Playgroud)
代替
Widget() {}
Run Code Online (Sandbox Code Playgroud)
?
如果在原始帖子违反某些SO规则后延长此问题,我深表歉意.为默认构造函数发布一个几乎完全相同的问题让我觉得不太理想.
c++ user-defined-functions default-constructor deleted-functions c++11
如果我的C++代码(如下所示)有一个初始化为空字符串的字符串,这有什么关系:
std::string myStr = "";
....some code to optionally populate 'myStr'...
if (myStr != "") {
// do something
}
Run Code Online (Sandbox Code Playgroud)
与no/null初始化:
std::string myStr;
....some code to optionally populate 'myStr'...
if (myStr != NULL) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
有没有最好的做法或陷阱?
考虑这段代码
string str;
cout << str[0] << str.size();
Run Code Online (Sandbox Code Playgroud)
而我得到的是不是一个运行时错误,但是" 0"
,一个0
下面的空间.为什么这可能?
以下安全吗?
string s;
s += "dsgdf";
cout << s;
Run Code Online (Sandbox Code Playgroud)
字符串是自动初始化的""
还是我需要这样做?