在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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);
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论