解析C++老手也会出现的问题
对于刚刚接触到C++的用户来说,C++确实拥有比别的开发语言更复杂的问题, 学习C++时应该注意由易至难,循序渐进,要成为C++老手,不是那么容易的,必须要花很大的努力。
如:const int a;和int const b;中,虽然两种具有相同的意义,但是最好利用后面的那种情况,后面的更加可读,因为:int const我们可以很清楚地看到const是修饰int,而前面的那种方法中,我们就不那么轻易知道到底const 的具体涵义。由后面的那种方法我们可以知道const指一个恒定的整形。Int *const b,指的是一个恒定的指针b,这个指针指向一个整型。
所以这个指针的内容可以改变,但是它的指针值也就是b的值不能变,相应的int const *b,指的是一个指向恒定整型内容的指针b,也就是说这个b的内容可以变,但是开始的b所指向的地址中的内容不能在程序当中通过b来改变。volatile对上面的原则也适用,使用类型T做为类型变量已经作为了模板参数的惯例,用来表示函数或者类所接受的类型参量可以用所有的类型。
在C++的模板的类型参量前,最好尽量使用typename来代替class。在编译时期,模板被编译两次;实例化之前:检查模板代码本身,查看语法是否正确;在实例化期间,检查模板代码,查看是否所有的调用都有效。
当使用函数模板,并且引发模板实例化的时候,编译器需要查看模板定义。在函数实参的类型的推导中,如果类型出现不匹配现象则会出现编译错误。如果要解决这编译错误则有以下几种方法解决:对传入的实参进行类型转换成匹配类型后传入。显示指定模板函数的全特化(不能为偏特化,因为函数不支持偏特化)类型。
例子如下所示:
template < typename T > T & max(T & value1,T & value2) { return value1 > value2 ? value1:value2; } 调用max( 3 , 4.1 )会出现编译错误,解决的办法: 1 .max(static_cast < double > ( 3 ), 4.1 ); 2 .max < double > ( 3 ); 3 .将函数的模板参数从一个改为两个。
在模板函数内部不能指定默认的模板参数。函数不能采用偏特化的方法来实现类型的递归,但是它可以利用函数重载的方法来实现类型的转换。相对于8而言类能使用偏特化的方法来实现类型的递归。