lego@ubuntu:~$> 命名空间
#include
using namespace std;
namespace stdSwap //增加命名空间也可以解决函数同名同参等冲突
{
template
void swap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
};
template
void swap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
template
int add(T& a, V& b)
{
return a + b;
}
int main(int argc, const char *argv[])
{
double dx = 3.5, dy = 4.5;
cout << dx << " " << dy << endl;
cout << "swap(dx, dy)" << endl;
//经过多种情况测试,::的作用就是在本命名空间下找该模板函数,不管是否定义命名空间;只要存在就行,不过,如果你写两个一模一样的模板函数,但是没有用命名空间去区分它们,这样肯定不行啦!
//而命名空间::模板函数的调用,则需要提供命名空间,并且在空间内定义出模板函数,否则编译器无法找到!这就是::的机制,经过测试应该是如此。
::swap(dx, dy); //加::避免和系统库函数发生冲突;
//stdSwap::swap(dx, dy); //增加命名空间后调用方式
cout << dx << " " << dy << endl;
int dz = 4;
cout << "dx(4) + dz(3.5) = " << ::add(dx, dz) << endl;
return 0;
}
lego@ubuntu:~$> 异常
/*file: ecp.cpp
*Explain:
* 异常的机制粗解
*/
#include
#include
using namespace std;
class FILE_OPEN_ERROR{};
void tryCatch(const char *fileName);
void fileOpen(const char *fileName);
//这种的话就是属于异常申诉:提前告诉编译器,做好异常捕捉,减轻上游函数的压力:
// 异常沿着函数调用向上抛掷,这样上游函数压力就增大,也就是我们catch的那个函数,这块地方很多都不理解!其实我看来是机制不了解,更谈不上去使用异常了!
//void fileOpen(const char *fileName) throw (FILE_OPEN_ERROR);
//至于后面还有捕捉不到的异常的概念,这里主要时谈到Terminate,终止程序运行,这是无法回头的,它不属于栈结构,因此无法恢复我以前理解的上下文;
// 不过可以通过set_terminate(function_name)去修改默认处理方式!
void tryCatch(const char *fileName)
{
//FILE *fopen(const char *path, const char *mode);
try{
fileOpen(fileName);
}catch(FILE_OPEN_ERROR){
cout << "File open error!" << endl;
}
}
void fileOpen(const char *fileName)
{
FILE *fp;
fp = fopen(fileName, "r");
if (fp == NULL) throw FILE_OPEN_ERROR();
}
int main(int argc, const char *argv[])
{
//tryCatch("/home/akaedu/c++/exception/ecp.cpp");
tryCatch("/home/akaedu/c++/exception/error.cpp");
return 0;
}
阅读(1201) | 评论(0) | 转发(0) |