《C++标准程序库》读书笔记(一)

时间:2023-01-05 19:52:37
《C++标准程序库》读书笔记(一)

1,很多编译器都要求模板的定义和实现都在头文件中,这是因为必须先为他提供某个实现品,然后才能调用,也只有如此才能通过编译。目前唯一能让“template的运用具有可移植性的方式,就是在头文件中以inline function实现temlate function

2下面typename指出SubTypeT中定义的一个型别,若不用这个关键字,则编译器会认为是两个数相乘,而不是定义的指针。

class  classA
{
public :
    typedef 
int  SubType;
};
template 
< typename T >
class  MyClass
{
    typename T::SubType 
* ptr;
};
int  main()
{
    MyClass
< classA >  c1;
    
return   0 ;
}

3,类成员函数可以是模板函数,但这样的成员模板函数不能是虚拟的,也不能有缺省参数。下面这个例子中assign函数中,由于参数x*this类型不同,不能直接存取private成员,而必须通过公有方法getValue访问。模板构造函数用于在复制对象时实现隐式类型转换,但它并不会屏蔽隐式拷贝构造函数,只要类型完全吻合,隐式拷贝构造函数就会被产生出来并被调用。

template  < typename T >
class  MyClass
{
private :
    T value;
public :
    MyClass()
    {
        value 
=  T();
    }
    MyClass(T val)
    {
        value 
=  val;
    }
    template
< typename X >
    MyClass(
const  MyClass < X >&  x)
    {
        assign(x);
    }
    template
< typename X >
    assign(
const  MyClass < X >&  x)
    {
        value 
=  x.getValue();
    }
    T getValue()
    {    
        
return  value;
    }
};

int  main()
{
    MyClass
< int >  c1( 10 );
    MyClass
< int >  c2(c1); // calls built-in copy ctor
    MyClass < double > c3(c1); // template ctor 
    cout << c2.getValue() << endl;
    
return   0 ;
}

(为什么这段代码在vc6下编译通过,但在vs2005下无法编译通过?

4, dynamic_cast将多态类型向下转换为其实际静态类型,若转换失败则会丢出一个bad_cast异常。const_cast设定或去除类型的常熟性,也可以用来去除volatile,这些操作法只接受一个参数。

5,从标准异常类别中派生新类别

class  MyException :  public  exception
{
public :
    MyException(
char *  msg):exception(msg)
    {
    }
    
virtual   const   char *  what() const   throw ()
    {
        
return  exception::what();
    }
};

void  fun()
{
    
throw  MyException( " error occour " );
}
int  main()
{
    
try
    {
        fun();
    }
    
catch ( const  MyException &  exp)
    {
        cout
<< " just a test " << endl;
    }
    
    
return   0 ;
}

6auto_ptr不允许使用一般指针惯用的赋值初始化方式,必须使用数值来完成初始化:

auto_ptr < classA >  ptr( new  classA);
auto_ptr
< classA >  ptr2;
ptr2 
=  auto_ptr < classA > ( new  classA);