对于刚刚接触到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做为类型变量已经作为了模板参数的惯例,用来表示函数或者类所接受的类型参量可以用所有的类型。#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而言类能使用偏特化的方法来实现类型的递归。
并且它的仿函数也可以使用重载operator()来实现函数重载方法。但是它的一个问题就是在调用仿函数的时候一定要加上它的实例化参数类型,以及调用它的构造函数。函数调用的时候可以采用由参数的类型来反推函数的模板参数,这是仿函数所不能的。所以我们在编程的过程当中一定要注意这些不同技术之间的优点和不足,看看哪些更适合我们。
在调用非标准函数的时候最好要与调用标准函数区分开来,这样不致于使用程序产生歧义的错误。做法是:在变量或者函数的前面加上全局标识符。