解析C 老手也会出现的问题
创始人
2024-06-22 05:50:15
0

对于刚刚接触到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。在编译时期,模板被编译两次;实例化之前:检查模板代码本身,查看语法是否正确;在实例化期间,检查模板代码,查看是否所有的调用都有效。

当使用函数模板,并且引发模板实例化的时候,编译器需要查看模板定义。在函数实参的类型的推导中,如果类型出现不匹配现象则会出现编译错误。如果要解决这编译错误则有以下几种方法解决:对传入的实参进行类型转换成匹配类型后传入。显示指定模板函数的全特化(不能为偏特化,因为函数不支持偏特化)类型。

例子如下所示:

  1. template < typename T >   
  2. T  & max(T  & value1,T  & value2)  
  3. {   
  4.    return  value1 > value2 ? value1:value2;  
  5. }   
  6.    
  7. 调用max( 3 , 4.1 )会出现编译错误,解决的办法:  
  8.  1 .max(static_cast < double > ( 3 ), 4.1 );  
  9.  2 .max < double > ( 3 );  
  10.  3 .将函数的模板参数从一个改为两个。 

在模板函数内部不能指定默认的模板参数。函数不能采用偏特化的方法来实现类型的递归,但是它可以利用函数重载的方法来实现类型的转换。相对于8而言类能使用偏特化的方法来实现类型的递归。

并且它的仿函数也可以使用重载operator()来实现函数重载方法。但是它的一个问题就是在调用仿函数的时候一定要加上它的实例化参数类型,以及调用它的构造函数。函数调用的时候可以采用由参数的类型来反推函数的模板参数,这是仿函数所不能的。所以我们在编程的过程当中一定要注意这些不同技术之间的优点和不足,看看哪些更适合我们。

在调用非标准函数的时候最好要与调用标准函数区分开来,这样不致于使用程序产生歧义的错误。做法是:在变量或者函数的前面加上全局标识符。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...