在C中,typedef不为您提供任何附加类型安全性。您可以在任何地方使用新类型,也可以使用旧类型。有时这是我想要的,有时不是。有时,我希望编译器警告我,如果我滥用我的新类型。
为了实现这一点,我有时会做这样的事情:
typedef struct {
int value;
} NewType;
NewType doSomethingNT(NewType a, NewType b) {
return a.value + b.value;
}
与之相比:
int doSomethingI(int a, int b) {
return a + b;
}
(这只是一个例子。让我
throw()是作为异常说明符在C++03中添加的,但是在C++11中,noexcept说明符不推荐使用它。
在分析了一些使用throw()、noexcept和普通函数查找速度的代码之后,我发现它们对函数调用的时间大致相同。
结果:
throw() noexcept plain old function
11233 ms 11105 ms 11216 ms
11195 ms 11122 ms 11150 ms
11192 ms 11151 ms 11231 ms
11214 ms 11218 ms
我想你们都听说过‘互换问题’,所以关于它的问题太多了。不使用第三个变量的交换版本通常被认为是更快的,因为您少了一个变量。我想知道窗帘后面发生了什么事,并写了以下两个程序:
int main () {
int a = 9;
int b = 5;
int swap;
swap = a;
a = b;
b = swap;
return 0;
}
而没有第三个变量的版本:
int main () {
int a = 9;
int b = 5;
a ^= b;
b ^= a;
a ^= b;
我理解静态绑定和动态绑定之间的区别,因为方法调用是在编译时为静态绑定确定的,而方法调用是在运行时为动态绑定确定的。
我不明白的一件事是,为什么您必须传递引用或指针进行动态绑定。我试着上网看看,但还是很困惑。这是因为当您传递值时,您传递的是一个副本,这意味着它必须被初始化,这意味着它被切片了?
例如,Pet是基类,Dog是派生类。
现在..。
void print(Pet p) {} // Calls print from the pet class
void print(Pet &p) {} // Calls print from the type of pet object bein