C++快速温习笔记(高级)[4]
来源:互联网 发布:阿里云域名代理 编辑:程序博客网 时间:2024/06/06 13:20
模板:
函数模板:
template <typename type>ret-type func-name(parameter list)
{
//函数的主体
}
e.g.
template <typename T>
T add(T a, T b)
{
return a + b;
}
cout << add(3, 6) <<endl;
cout << add(1.1, 2.2) <<endl;
类模板:
template <class type> classclass-name {
…
};
e.g.
template <class T>
class Stack{
private:
vector<T> elems;
public:
void push(T const&);
void pop();
T top() const;
bool empty(){
return elems.empty();
}
};
template <class T>
void Stack<T>::push (Tconst& elem)
{
elems.push_back(elem);
}
template <class T>
void Stack<T>::pop()
{
if (elems.empty())
{
throw out_of_range("Emptystack.");
}
elems.pop_back();
}
template <class T>
T Stack<T>::top() const
{
if (elems.empty())
{
throw out_of_range("Emptystack.");
}
return elems.back();
}
tips:
关于成员函数const关键字的说明:
- 要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const
- 在类体之外定义const成员函数时,还必须加上const关键字
- 若将成员成员函数声明为const,则该函数不允许修改类的数据成员
- 把一个成员函数声明为const可以保证这个成员函数不修改数据成员,但是,如果据成员是指针,则const成员函数并不能保证不修改指针指向的对象,编译器不会把这种修改检测为错误
- const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员
- 非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员
- 作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const成员函数
预处理器:
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。
所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。
预处理的几个示例:
1.预定义常量:
#define PI 3.1415
2.预定义方法:
#define ADD(a,b) a+b
3.定义DEBUG信息
#define DEBUG
#ifdef DEBUG
cerr << "Debugginginformation" << endl;
#endif
4.取消某个定义
#undef DEBUG
5.组合条件判断
#define DEBUG
#define ERROR
#if defined(DEBUG) && (defined(ERROR) || defined(WARN))
cerr << "Warning:blablabla" << endl;
#endif
6.条件分支
#ifndef INFO
#define INFO 1
#else
#undef INFO
#define INFO 1
#endif
7.注释掉部分语句使其不参与编译
#if 0
//code will not be compiled
#endif
8. #运算符会把replacement-text令牌转换为用引号引起来的字符串,例如:
#define MKSTR( x ) #x
9. ##运算符用于连接两个令牌,将结果转换为字符串,例如:
#define CONCAT( x, y ) x ## y
C++中预定义的宏:
宏
描述
__LINE__
这会在程序编译时包含当前行号。
__FILE__
这会在程序编译时包含当前文件名。
__DATE__
这会包含一个形式为 month/day/year的字符串,它表示把源文件转换为目标代码的日期。
__TIME__
这会包含一个形式为 hour:minute:second的字符串,它表示程序被编译的时间。
e.g.
cout <<"Value of __LINE__ : " << __LINE__ << endl;
cout <<"Value of __FILE__ : " << __FILE__ << endl;
cout <<"Value of __DATE__ : " << __DATE__ << endl;
cout <<"Value of __TIME__ : " << __TIME__ << endl;
信号处理:
信号是由操作系统传给进程的中断,会提早终止一个程序。例如在 UNIX、LINUX、Mac OS X 或 Windows系统上,可以通过按 Ctrl+C产生中断。有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作。这些信号是定义在 C++头文件<csignal>中。
信号
描述
SIGABRT
程序的异常终止,如调用 abort。
SIGFPE
错误的算术运算,比如除以零或导致溢出的操作。
SIGILL
检测非法指令。
SIGINT
接收到交互注意信号。
SIGSEGV
非法访问内存。
SIGTERM
发送到程序的终止请求。
C++信号处理库提供了 signal函数,用来捕获突发事件。signal()函数的定义:
void (*signal (intsig, void (*func)(int)))(int);
这个函数接收两个参数:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。
e.g.
void signalHandler(int sig)
{
cout << "Interrupt signal (" << sig <<") received.\n";
exit(sig);
}
signal(SIGINT, signalHandler);
while (true)
{
cout << "#";
for (int i = 0; i < 10000000; i++) { }
}
可以使用raise函数来生成一个signal,raise()函数的定义:
int raise (signalsig);
e.g.
raise(SIGINT);
- C++快速温习笔记(高级)[4]
- C++快速温习笔记(高级)[1]
- C++快速温习笔记(高级)[2]
- C++快速温习笔记(高级)[3]
- C++快速温习笔记(基本)[1]
- C++快速温习笔记(基本)[2]
- 温习Java笔记(4):类和对象
- 温习快速排序
- 快速排序温习
- 快速排序 温习 QuickSort
- 几张图快速温习js
- C语言温习笔记之局部变量与全局变量
- C语言温习笔记之变量的存储类别
- C语言字符串温习
- C/C++ typedef 温习
- C语言温习
- c语言 温习整理
- 温习 C语言
- NODE基础(八)
- CORS
- 2017.01.31 看别人的博客,自己也重新kankan
- jQuery-快速实现多级菜单效果
- CentOS7 下Redis的安装以及使用
- C++快速温习笔记(高级)[4]
- 【VS开发】【OpenGL开发】OpenGL---Windows下配置与第一个OpenGL程序
- Java常用类的知识点
- poj 2352 Stars 树状数组
- 前端开发IDE Webstorm使用技巧 2017年1月31日
- 暴露问题是对项目验收最起码的尊重!
- javascript笔记--(第一章)javascript概述
- 1026. 程序运行时间(15)
- 使用DISPATCH_SOURCE_TYPE_DATA_ADD派发源