1 异常规格(exception specification)
用来指定某个函数可能抛出哪些异常,例如:
void fun() throw(bad_alloc); //fun()只能丢出bad_alloc异常
void fun() throw(); //fun()不抛出任何异常
void fun() throw()(E1, E2, E3); //fun()只能丢出E1, E2, E3异常
2 命名空间
定义命名空间
namespace uvsjoh {
int a;
void fun() { cout<< "uvsjoh::fun" << endl; }
};
namespace是开发的,你可以在不同模块中定义和扩展namespace。
例如可以在同一文件中同时出现如下定义
namespace uvsjoh {
int a;
void fun() { cout<< "uvsjoh::fun" << endl; }
};
namespace uvsjoh {
int b;
void fun2() { cout << "uvsjoh::fun2" << endl; }
};
当然它们也可以出现在不同的文件中。
不要轻易使用using directive。
using directive等于将所有namespace中的名字声明于namespace之外。这将容易造成名称冲突。
所有,如不场合不甚清楚(例如不清楚究竟是在头文件、模块里还是程序库里),你不应该使用using directive。事实上在头文件中使用using directive是相当不明智的。
如果程序很小,那么直接使用using namespace std;会很方便。
3 可移植的main()
根据C++标准只有两种main()是可移植的
int main()
{
...
}
int main(int argc, char *argv[])
{
...
}
4 类型的名字
typeid(type).name()
5 捕获异常
捕获任何异常,一般用于异常发生时执行清理工作
try {
...
}
catch (...) {
//clean up
throw; // - rethrow the exception
}
6 STL智能型指针auto_ptr -- 解决在异常处理过程中的资源遗失问题。
智能型指针保证,无论在何种情形下,只要自己被销毁,就一定连带释放其所指资源。
智能型指针本身就是区域变量,所以无论是正常退出,还是异常退出,只要函数退出,它就一定会被销毁。
class A;
std::auto_ptr<A> ptr(new A);
当超出作用域或异常退出时A的虚构函数会被自动调用。
好的建议是:始终使用const std::auto_ptr

浙公网安备 33010602011771号