《C++标准程序库》读书笔记(一)
来源:互联网 发布:淘宝卖精仿 编辑:程序博客网 时间:2024/05/21 06:28
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;
}
{
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;
}
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;
}
{
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);
auto_ptr<classA> ptr2;
ptr2 = auto_ptr<classA>(new classA);
- 《C++标准程序库》读书笔记(一)
- 《C++标准程序库》读书笔记(一)
- 《C++标准程序库》读书笔记(一)
- 《C++标准程序库》读书笔记一
- 《Boost程序库完全开发指南——深入C++“准”标准库》读书笔记(一)
- 《C++标准程序库》读书笔记(四)
- 《C++标准程序库》读书笔记(三)
- 《C++标准程序库》读书笔记(二)
- 《C++标准程序库》读书笔记
- C++标准程序库学习笔记(一)
- C++标准程序库(一)
- 《C++标准程序库》读书笔记二
- 【C++】《C++标准程序库》重难点分析(一)~(五)章
- C标准程序库头文件
- 《C++标准程序库》读书笔记 -- 持续更新
- 《C++标准程序库》学习笔记(一)初识STL
- 《C++标准程序库》学习笔记(一)C++相关特性
- C++标准程序库细节整理(一)第四章
- Bitwise Operation Explained
- 《C++标准程序库》读书笔记(三)
- 【译】TetroGL: An OpenGL Game Tutorial in C++ for Win32 Platforms - Part 2 (下)
- 【译】TetroGL: An OpenGL Game Tutorial in C++ for Win32 Platforms - Part 2 (上)
- 《C++标准程序库》读书笔记(二)
- 《C++标准程序库》读书笔记(一)
- 我的书架:COM组件开发
- COM组件开发实践(三)
- COM组件开发实践(二)
- COM组件开发实践(一)
- C++ Exercises(十七)--图的简单实现
- 平衡二叉树(AVL树)的简单实现
- 学习总结
- 用VC6.0遇到的一个问题