我决定更熟悉我最喜欢的编程语言,但只阅读标准很无聊.
什么是最令人惊讶,反直觉,或只是简单的C++元素?令你震惊的是你跑到最近的编译器检查它是否真的如此?
我会接受第一个答案,即使在我测试之后我也不会相信.:)
hen*_*nle 10
我发现这有点令人惊讶
class aclass
{
public:
int a;
};
some_function(aclass());
Run Code Online (Sandbox Code Playgroud)
将a初始化为0in some_function,while
aclass ac;
some_function(ac);
Run Code Online (Sandbox Code Playgroud)
会留下单位资本.如果明确定义默认构造函数aclass:
class aclass
{
public:
aclass(): a() {}
int a;
};
Run Code Online (Sandbox Code Playgroud)
然后
aclass ac;
也会初始化a为0.
我可以添加的另一个答案是throw()限定符.例如:
void dosomething() throw()
{
// ....
}
void doSomethingElse() throw(std::exception)
{
// ....
}
Run Code Online (Sandbox Code Playgroud)
直观地说,这看起来像是与编译器的契约,表明除了列出的那些之外,不允许该函数抛出任何异常.但实际上,这在编译时没有任何作用.相反,它是一个运行时机制,它不会阻止该函数实际抛出异常.更糟糕的是,如果抛出未列出的异常,它会通过调用来终止您的应用程序std::terminate().
几个声明符的顺序实际上是无序的:
volatile long int const long extern unsigned x;
Run Code Online (Sandbox Code Playgroud)
是相同的
extern const volatile unsigned long long int x;
Run Code Online (Sandbox Code Playgroud)
考虑到C++通常是多么无情,我发现有些令人惊讶的是标准实际上允许你使用delete空指针.
| 归档时间: |
|
| 查看次数: |
678 次 |
| 最近记录: |