C++标准程序库笔记(1)
2015-08-10 19:39
337 查看
C++及其标准程序库简介
1、template
例子:
Default Template Parameters
typename
typename 指定为类型
例子:
typename 指定SubType为一种类型名,否则当做变量名来使用
条件是T中有SubType类型例如typedef int SubType
因此C++的一般规则是,除了以typename修饰外,template内的任何标识符都被视为一个变量而非类别
Member Template
例子:
2、基本类型的显式初始化
如果采用不含参数的,明确地构造函数调用,基本类别会被初始化为0
3、异常处理
通过异常处理,C++标准程序库可以在不“污染”函数接口(即参数和返回值)的情况下处理异常。
4、命名空间
using namespace std;
using std::cout; //using declaration 将cout引入到当前域中,等价与在当前域中定义cout
5、bool类型
6、关键字explicit
禁止“单参数构造函数“被用于自动类型转换
例子:
7、新的类型转换操作符
static_cast 利用原值重建一个临时对象,并在设立初值时使用类型转换
没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
例子:
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
reinterpret_cast
reinterpret_cast通常为操作数的位模式提供较低层的重新解释.
C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:
int i;
char *p = “This is a example.”;
i = reinterpret_cast(p);
//注意这些操作符都只接受一个参数
例子:static_cast(15,100)等价于static_cast(100)
8、常数静态成员的初始化
现在能再class声明中对整数型常数静态成员直接赋初值
例子:
9、main()的定义式
只有两种main()是可移植的
1、template
例子:
template <class T> inline const T& max(const T& a, const T& b) { return a<b?b:a; }
Default Template Parameters
template <class T, class container = vector<T> > //需要有空格
typename
typename 指定为类型
例子:
template <class T> class MyClass{ typename T::SubType *ptr; };
typename 指定SubType为一种类型名,否则当做变量名来使用
条件是T中有SubType类型例如typedef int SubType
因此C++的一般规则是,除了以typename修饰外,template内的任何标识符都被视为一个变量而非类别
Member Template
例子:
class MyClass{ template <class T> void f(T); };
2、基本类型的显式初始化
如果采用不含参数的,明确地构造函数调用,基本类别会被初始化为0
int i1; //不确定的值 int i2 = int(); //初始化为0
3、异常处理
通过异常处理,C++标准程序库可以在不“污染”函数接口(即参数和返回值)的情况下处理异常。
class Error; void f() { if(异常情况){ throw Error(); //创建对象并作为参数抛出 } } //此时程序不会跳转,但是会调用catch int main() { try{ f(); } catch(const Error&){ //handle } }
4、命名空间
using namespace std;
using std::cout; //using declaration 将cout引入到当前域中,等价与在当前域中定义cout
5、bool类型
6、关键字explicit
禁止“单参数构造函数“被用于自动类型转换
例子:
class Stack{ explicit Stack(int size); } Stack s = 40; //如果没有explicit则可以赋值,如果有则出错 Stack s(40); //OK
7、新的类型转换操作符
static_cast 利用原值重建一个临时对象,并在设立初值时使用类型转换
没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
例子:
cout<< static_cast<int>(x); //print x as int f(static_cast<string>("hello")); //call f() for string instead of char*
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
例子:
class Car; class Cab:public Car{}; Car *cp; Cab *p = dynamic_cast<Cab*>(cp); //相当于动态多态的转换
const_cast //设定或去除类型的常数性,亦可去除volatile饰词, 该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
reinterpret_cast
reinterpret_cast通常为操作数的位模式提供较低层的重新解释.
C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:
int i;
char *p = “This is a example.”;
i = reinterpret_cast(p);
//注意这些操作符都只接受一个参数
例子:static_cast(15,100)等价于static_cast(100)
8、常数静态成员的初始化
现在能再class声明中对整数型常数静态成员直接赋初值
例子:
class MyClass{ static const int num = 100; int elems[num]; }; //在外界需要为其定义一个空间 const int MyClass::num;
9、main()的定义式
只有两种main()是可移植的
int main() { } int main(int argc, char* argv[]) { }
C++在main()的末尾定义了一个隐式的return 0;
相关文章推荐
- Python标准库os.path包、glob包使用实例
- Python标准库内置函数complex介绍
- PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
- C标准库<assert.h>的实现详解
- 浅析C++标准库元组(tuple)源码
- PHP SPL标准库中的常用函数介绍
- Python标准库之循环器(itertools)介绍
- Python标准库之Sys模块使用详解
- Python标准库之sqlite3使用实例
- Python标准库之随机数 (math包、random包)介绍
- Python标准库defaultdict模块使用示例
- Python标准库urllib2的一些使用细节总结
- 单例分享(循环引用及内存占用解决)
- 开始写一本书:《Go语言标准库》,欢迎Go爱好者阅读
- C++的构造函数浅析
- 标准库string原理与实现
- C语言宏定义##连接符和#符的使用
- vector或其他标准库容器类型形参
- C标准库中的时间函数
- 利用标准库中sort函数进行排序