C++编程错误分为:注重隐性的数据类型转换、结构与对象是有区别的、虚方法必须被明确地覆盖,下面就C++编程时遇到的错误进行学习探讨,希望大家能够在此得到自己想要的东西。
错误1:注重隐性的数据类型转换
Boxing和unboxing是使值型数据类型被当作索引型数据类型使用的二个过程。值型变量可以被包装进一个对象中,然后再被解包回值型变量。包括内置数据类型在内的所有C#中的数据类型都可以被隐性地转化为一个对象。包装一个值型变量就会生成一个对象的实例,然后将变量拷贝到实例中。#t#
Boxing是隐性的,假如在需要索引型数据类型的地方使用了值型数据类型的变量,值型变量就会隐性地转化为索引型数据类型的变量。Boxing会影响代码执行的性能,因此应当尽量避免,尤其是在数据量较大的时候。
假如要将一个打包的对象转换回原来的值型变量,必须显性地对它进行解包。解包需要二个步骤:首先对对象实例进行反省,确保它们是由值型的变量被包装成的;第二步将实例中的值拷贝到值型变量中。为了确保解包成功,被解包的对象必须是通过打包一个值型变量的值生成的对象的索引。
- using System;
- public class UnboxingTest
- {
- public static void Main()
- {
- int i = 123; //打包
- object o = i; // 解包(必须是显性的)
- int j = (int) o;
- Console.WriteLine("j: {0}", j); }
- }
错误2:结构与对象是有区别的
C++中的结构与类差不多,***的区别是,在缺省状态下,结构的访问权限是public,其继续权限也是public.一些C++编程人员将结构作为数据对象,但这只是一个约定而非是必须这样的。在C#中,结构只是一个用户自定义的数据类型,并不能取代类。尽管结构也支持属性、方法、域和操作符,但不支持继续和destructor.
更重要的是,类是一种索引型数据类型,结构是值型数据类型。因此,结构在表达无需索引操作的对象方面更有用。结构在数组操作方面的效率更高,而在集合的操作方面则效率较低。集合需要索引,结构必须打包才适合在集合的操作中使用,类在较大规模的集合操作中的效率更高。
错误3:虚方法必须被明确地覆盖
在C#语言中,编程人员在覆盖一个虚方法时必须显性地使用override关健字。假设一个Window类是由A公司编写的,ListBox和RadioButton类是由B公司的和编程人员在购买的A公司编写的Window类的基础上编写的,B公司的编程人员对包括Window类未来的变化情况在内的设想知之甚少。假如B公司的一位编程人员要在ListBox上添加一个Sort方法:
- public class ListBox : Window
- { public virtual void Sort() {"}
- }
在A公司发布新版的Window类之前,这不会有任何问题。假如A公司的编程人员也在Window类中添加了一个Sort方法。
- public class Window
- { // " public virtual void Sort() {"}
- }
在C++中,Windows类中的Sort方法将成为ListBox类中Sort方法的基础方法,在期望调用Windows类中的Sort方法时,ListBox类中的Sort方法就会被调用。在C#中,虚拟函数总是被认为是虚拟调度的根。也就是说,一旦C#发现一个虚拟的方法,就不会再在虚拟链中查找其他虚拟方法。假如ListBox再次被编译,编译器就会生成一个警告信息:
- "class1.cs(54,24): warning CS0114: 'ListBox.Sort()' hides
- inherited member 'Window.Sort()'.
要使当前的成员覆盖原来的方法,就需要添加override关健字,或者添加new关健字。要消除警告信息,编程人员必须搞清楚他想干什么。可以在ListBox类中的Sort方法前添加new,表明它不该当覆盖Window中的虚方法:
- public class ListBox : Window {
- public new virtual void Sort() {"}
这样就可以清除警告信息。假如C++编程人员确实期望覆盖掉Window中的方法,就必须使用override关健字来显性地表明其意图。