因为是普通的传值,需要先构造临时对象,会再次调用拷贝构造函数,造成递归。所以拷贝构造函数的入参不能为普通传值。
2.typename
template<class T>
class MyClass{
typename T::SubType *ptr;
};
typename指出SubType是Class T中定义的一个型别,ptr是一个指向T::SubType型别的指针。
没有typename,SubType会被当成Class T类中的一个static成员。
定义内部型别
class Q {
typedef int SubType;
}
class Q {
class SubType;
};
3.非型别模板
例如:bitset<20> flags20;
4.缺省模板参数
template <class T, class container = vector<T> >
class MyClass;
5.成员模板
template<class T>
class MyClass {
T value;
template<class X>
void assign(const MyClass<X>& x);
}
Template Constructor是成员模板的一种特殊形式。Template constructor通常用于“再复制对象时实现隐式型别转换”。
注意:template constructor并不隐藏implicit copy constructor。
6.异常抛出
void f() throw();// 不抛出任何异常
void f() throw(bad_alloc, bad_cast);// 抛出bad_alloc或bad_cast异常
void f(); // 可能抛出任何异常
7.namespace
using declaration:using std::cout;
using directive:using namespace std;
定义名字空间:
namespace josuttis {
class File;
}
8.如果某个函数的一个或多个参数型别,定义与函数所处的名字空间中,那么可以不为改函数指定名字空间,这个规则称为Koenig lookup
9.reinterpret_cast
如何使用?
10.常数静态成员初始化
class Myclass{
static const int num = 100;
};
const int Myclass::num;// 需要定义一个空间,VS2005不进行定义也可以正常运行。
TODO:确认标准如何规定
11.非常量静态成员的初始化
class Myclass{
public:
static int num ;
};
int Myclass::num = 100;// 需要定义一个空间
12.异常分类
语言本身支持的异常:
bad_alloc,bad_cast,bad_typei,bad_exception
C++程序库所发生的异常:
logic_error,及其之类invalid_argument,length_error,out_of_range,domain_error
程序作用域之外发生的异常:
runtime_error及其之类range_error,overflow_error,underflow_error
程序库所抛出的异常:
range_error,out_of_range,invalid_argument,bad_alloc及客户代码中抛出的异常。
13.const char* p, char* const p
const char* p p指向的内如不能改变。
char* const p 指针p不能改变。p不能再指向其他数据。
14.只有当对象完全构造成功,才有可能于将来调用其构造函数。
ClassB (Class A& val1, ClassA& val2):ptr1(new ClassA(val1),ptr2(new ClassA(val2){}存在资源泄露可能,解决方法是使用智能指针。
15.数值极限
头文件:<limits>
范例:numeric_limits<int>::min()