您的位置:首页 > 编程语言 > C语言/C++

C++标准程序库笔记(1)

2015-08-10 19:39 337 查看
C++及其标准程序库简介

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++语言 标准库