对C++编程错误进行说明讲解

开发 后端
C++中的结构与类差不多,唯一的区别是,在缺省状态下,结构的访问权限是public,其继续权限也是public.一些C++编程人员将结构作为数据对象,但这只是一个约定而非是必须这样的

C++编程错误分为:注重隐性的数据类型转换、结构与对象是有区别的、虚方法必须被明确地覆盖,下面就C++编程时遇到的错误进行学习探讨,希望大家能够在此得到自己想要的东西。

错误1:注重隐性的数据类型转换

Boxing和unboxing是使值型数据类型被当作索引型数据类型使用的二个过程。值型变量可以被包装进一个对象中,然后再被解包回值型变量。包括内置数据类型在内的所有C#中的数据类型都可以被隐性地转化为一个对象。包装一个值型变量就会生成一个对象的实例,然后将变量拷贝到实例中。#t#

Boxing是隐性的,假如在需要索引型数据类型的地方使用了值型数据类型的变量,值型变量就会隐性地转化为索引型数据类型的变量。Boxing会影响代码执行的性能,因此应当尽量避免,尤其是在数据量较大的时候。

假如要将一个打包的对象转换回原来的值型变量,必须显性地对它进行解包。解包需要二个步骤:首先对对象实例进行反省,确保它们是由值型的变量被包装成的;第二步将实例中的值拷贝到值型变量中。为了确保解包成功,被解包的对象必须是通过打包一个值型变量的值生成的对象的索引。

  1. using System;  
  2. public class UnboxingTest  
  3. {  
  4. public static void Main()  
  5. {  
  6. int i = 123; //打包  
  7. object o = i; // 解包(必须是显性的)  
  8. int j = (int) o;  
  9. Console.WriteLine("j: {0}", j); }  
  10. }  

错误2:结构与对象是有区别的

C++中的结构与类差不多,***的区别是,在缺省状态下,结构的访问权限是public,其继续权限也是public.一些C++编程人员将结构作为数据对象,但这只是一个约定而非是必须这样的。在C#中,结构只是一个用户自定义的数据类型,并不能取代类。尽管结构也支持属性、方法、域和操作符,但不支持继续和destructor.

更重要的是,类是一种索引型数据类型,结构是值型数据类型。因此,结构在表达无需索引操作的对象方面更有用。结构在数组操作方面的效率更高,而在集合的操作方面则效率较低。集合需要索引,结构必须打包才适合在集合的操作中使用,类在较大规模的集合操作中的效率更高。

错误3:虚方法必须被明确地覆盖

在C#语言中,编程人员在覆盖一个虚方法时必须显性地使用override关健字。假设一个Window类是由A公司编写的,ListBox和RadioButton类是由B公司的和编程人员在购买的A公司编写的Window类的基础上编写的,B公司的编程人员对包括Window类未来的变化情况在内的设想知之甚少。假如B公司的一位编程人员要在ListBox上添加一个Sort方法:

  1.   public class ListBox : Window  
  2.   { public virtual void Sort() {"}  
  3. }   

在A公司发布新版的Window类之前,这不会有任何问题。假如A公司的编程人员也在Window类中添加了一个Sort方法。

  1. public class Window  
  2. { // " public virtual void Sort() {"}  

在C++中,Windows类中的Sort方法将成为ListBox类中Sort方法的基础方法,在期望调用Windows类中的Sort方法时,ListBox类中的Sort方法就会被调用。在C#中,虚拟函数总是被认为是虚拟调度的根。也就是说,一旦C#发现一个虚拟的方法,就不会再在虚拟链中查找其他虚拟方法。假如ListBox再次被编译,编译器就会生成一个警告信息:

  1. "class1.cs(54,24): warning CS0114: 'ListBox.Sort()' hides  
  2. inherited member 'Window.Sort()'. 

要使当前的成员覆盖原来的方法,就需要添加override关健字,或者添加new关健字。要消除警告信息,编程人员必须搞清楚他想干什么。可以在ListBox类中的Sort方法前添加new,表明它不该当覆盖Window中的虚方法:

  1. public class ListBox : Window {  
  2. public new virtual void Sort() {"}   

这样就可以清除警告信息。假如C++编程人员确实期望覆盖掉Window中的方法,就必须使用override关健字来显性地表明其意图。

责任编辑:chenqingxiang 来源: 人民邮电出版社
相关推荐

2010-01-25 18:26:44

CC++头文件

2010-03-03 16:20:40

Android项目

2010-03-15 10:39:57

2010-01-08 10:41:56

JSON 数据

2010-01-25 18:19:17

C++特性

2010-01-25 18:19:17

C++特性

2010-01-25 18:19:17

C++特性

2010-01-11 14:13:03

C++学习方法

2010-01-14 13:39:45

Visual C++优

2010-01-15 19:34:25

C++设计

2010-01-11 09:56:07

C++编程实例

2010-01-12 10:40:22

C++程序员

2010-01-13 18:47:53

C++教程

2010-01-20 17:48:07

C++ 函数重载

2010-01-28 14:04:35

C++链表

2010-01-13 16:44:03

C++

2010-01-27 14:24:15

C++程序设计

2010-01-12 17:55:03

C++程序

2010-01-13 10:16:42

C++软件

2010-01-15 17:18:57

C++源程序
点赞
收藏

51CTO技术栈公众号