Blog·Tanky WooABOUTRSS

《C++标准程序库》学习笔记1--第二章&第三章

23 Jan 2011
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

--------------------------- 第二章 --------------------------- 1.(P11) C++规定:除了以typename修饰外,template内的任何标志符号都被视为一个值(value)而非一个型别。 eg.

template 
class MyClass{
    typename T::SubType *ptr;
};

这里typename指出SubType是class T中定义的一个型别,因此ptr是一个指向T::SubType的指针,否则SubType会被当作一个static成员,于是: T::SubType *ptr被认为是SubType与ptr的乘积。

2.(P12) template class 的 member template问题: 下面例子,即使两个型别之间可以自动转换,如int和double,如果我们对assign()使用不同的template型别,也会出错。

template 
class MyClass{
private:
    T value;
public:
    void assign(cosnt MyClass & x)
    {
        // x must have same type as *this
        value = x.value;
    }
    ...
};

再看这个:

template 
class MyClass{
private:
    T value;
public:
    template   // member template
    void assign(cosnt MyClass & x)
    {
        // allows different template types
        value = x.getValue();
    }
    T getValue() const{
        return value;
    }
    ...
};

现在,assign()的参数x和this的型别并不相同,所以两个类也就不同*, 不能再直接存取MyClass<>的private成员和 protected成员,取而代之, 此例中使用了getValue()

3.(P14) 对基本型别的显示初始化 如果采用不含参数、明确的constructor调用语法,基本型别会被初始为 eg.

int i1;   // undefined value
int i2 = int();   // initialized with zero

4.(P16) 异常问题。    ①.异常处理不是错误处理;    ②.  void f() throw(xxx) 是f()抛出XXX类型的异常,       而void f() throw()  是指f()抛出任何异常,这里好多人容易弄错。

5.(P16) 命名空间。 eg.

namespace tankywoo{
    class A;
    class B;
    ...
}
...

则using tankywoo::A会使A成为当前作用域内代表tankywoo::A的同义字 而using namespace tankywoo会使namespace内的所有名字曝光(A和B)。

--------------------------- 第三章 --------------------------- 6.(P23) 命名空间 上一篇也讲过。 使用C++标准程序库的任何标识符时,有三种选择:(以下都以cout为例) ①直接指定标识符:

   std::cout << "Tanky Woo" << std::endl;

②使用using declaration,可使我们不再需要加上"std::"

   using std::cout;
   cout << "Tanky Woo" << std::endl;

③使用using directive,那么std内定义的所有标识符都有效。

  using namespace std;
  cout << "Tanky Woo" << endl;

7.错误处理和异常处理 异常处理这块接触的少,而且第三章这里也是简略的讲到,所以这里先放着,有经验了再补。

8.配置器(Allocators) 同上。