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

简介:

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

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

复制代码
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;
}
复制代码
6,auto_ptr不允许使用一般指针惯用的赋值初始化方式,必须使用数值来完成初始化:


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



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/08/18/1270639.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
存储 程序员 C语言
c++primer plus 6 读书笔记 第四章 复合类型
c++primer plus 6 读书笔记 第四章 复合类型
|
6月前
|
编译器 C++
c++primer plus 6 读书笔记 第十章 对象和类
c++primer plus 6 读书笔记 第十章 对象和类
|
6月前
|
算法 小程序 IDE
c++primer plus 6读书笔记第一章预备知识
c++primer plus 6读书笔记第一章预备知识
|
6月前
|
编译器 数据安全/隐私保护 C++
c++primer plus 6 读书笔记 第十三章 类继承
c++primer plus 6 读书笔记 第十三章 类继承
|
6月前
|
C++
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
|
6月前
|
C++
c++primer plus 6 读书笔记 第十一章 使用类
c++primer plus 6 读书笔记 第十一章 使用类
|
6月前
|
编译器 C++
c++primer plus 6 读书笔记 第八章 函数探幽0
c++primer plus 6 读书笔记 第八章 函数探幽0
|
6月前
|
编译器 vr&ar C++
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
|
6月前
|
C++
c++primer plus 6 读书笔记 第六章 分支语句和逻辑运算符
c++primer plus 6 读书笔记 第六章 分支语句和逻辑运算符
|
6月前
|
C语言 C++ 容器
c++primer plus 6 读书笔记 第五章 循环和关系表达式
c++primer plus 6 读书笔记 第五章 循环和关系表达式