C语言基础测试题答案doc.docx
《C语言基础测试题答案doc.docx》由会员分享,可在线阅读,更多相关《C语言基础测试题答案doc.docx(12页珍藏版)》请在冰豆网上搜索。
![C语言基础测试题答案doc.docx](https://file1.bdocx.com/fileroot1/2023-4/16/5b32a554-c299-4ac5-9d49-044c9b518c03/5b32a554-c299-4ac5-9d49-044c9b518c031.gif)
C语言基础测试题答案doc
C#基础测试题答案
1、
public关键字是类型和类型成员的访问修饰符。
公共访问是允许的最高访问级别,对访问公共成员没有限制。
protected关键字是一个成员访问修饰符。
受保护成员在它的类中可访问并且可山派生类访问。
private关键字是一个成员访问修饰符。
私有访问是允许的最低访问级别。
私有成员只有在声明它们的类和结构体中才是可访问的。
internal关键字是类型和类型成员的访问修饰符。
只有在同一-程序集的文件中,内部类型或成员才是可访问的。
2.
String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象。
StringBuilder类就不一样了,每次结果都会对StringBuilder对象本身进行操作,而不是生成新的对象,再改变对象引用。
3.
stringstr="”,表示一个空串,被实列化了,占用了内存空间,
stringstr=null,表示一个空引用,没有占用了空间,
4.
一、抽象类:
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。
抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。
另外,抽象类可以派生自一•个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
二、接口:
接口是引用类型的,类似于类,和抽象类的相似之处有三点:
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引眠、事件,而且这些成员都被定义为公有的。
除此之外,不能包含任何其他的成员,例如:
常量、域、构造函数、析构函数、静态成员。
一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
三、抽象类和接口的区别:
1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。
。
。
”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中.
2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
3.—个类一次可以实现若干个接口,但是只能扩展一个父类
4.接口可以用于支持PI调,而继承并不具备这个特点.
5.抽象类不能被密封。
6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的.
7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。
但是,允许抽象类将接口方法映射到抽象方法上。
8.抽象类实现了oop中的一个原则,把可变的与不可变的分离。
抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。
9.好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。
如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
10.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。
因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!
后果可想而知.(结合堆栈原理理解)。
同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。
比如中,Page类,有ServerRequest等属性,但其实他们都是某个类的对象。
使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。
11.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.
四、抽象类和接口的使用:
1.如果预计要创建组件的多个版本,则创建抽象类。
抽象类提供简单.的方法来控制组件版本。
2.如果创建的功能将在大范围的全异对象间使用,则使用接口。
如果要设计小而简练的功能块,则使用接口。
3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的己实现功能,则使用抽象类。
4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
5.
重载、至写和隐藏的定义:
重载:
同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。
这样才能通过传递不同的参数来决定到底调用哪一个。
而返回值类型不同是不能构成重载的。
重写:
继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的例如:
基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.
隐藏:
基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。
重载时,根据参数选择调用的方法;
重写时,访问父类子类皆调用子类的重写方法;
隐藏时,访问父类则调用父类的方法,子类子类的方法。
补充:
重写。
verride-般用于接口实现和继承类的方法改写,要注意
1、覆盖.的方法的标志必须要和被覆盖.的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返网值必须和被覆盖的方法的返同一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
6.
装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型
注:
被装过箱的对象才能被拆箱
装箱:
用于在垃圾同收堆中存储值类型。
装箱是值类型到object类型或到此值类型所实现的任何接口类型的隐式转换。
拆箱:
从object类型到值类型或从接口类型到实现该接口的值类型的显式转换。
7.
受管制代码:
在.net中,山公共语言运行环境进行管理的代码,它主要负责内存管理。
非托管代码:
在公共语言运行库环境的外部,山操作系统直接执行的代码。
非托管代码必须提供自己的垃圾Pl收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
托管代码:
山公共语言运行库环境(而不是直接山操作系统)执行的代码。
托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。
这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
8.
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
9.
能,不能,
因为静态方法在类加载的时候就初始化了,而非静态的成员变量不一定已初始化,而旦即便是初始化了,静态方法也不知道该访问哪个实例的变量。
类的静态成员(变最和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
10.
在switch(exp)中,exp只能是-个整数表达式或者枚举常量(javase5),整数表达式可以是int基本类型或Integer包装类型,山于byte,short,char都可以隐含转换为int,所以这些类型以及这些类型的包装类型也是可以的。
显然long和String类型都不符合switch语法的规定,并旦不能隐式的转换成int类型,所以它们不能作用于switch语句中,此时只能只能使用一系列的if等语句了。
11.
抽象方法不可以是static的因为static的方法不会被继承。
12.
数组中没有length。
这个方法,但是数组中有length这个属性。
用来表示数组的长度。
String中没有length()这个方法。
用来得到字符申的长度。
13、
在VS中运行下可知:
无法将类型“int”隐式转换为“short”。
存在一个显式转换(是否缺少强制转换?
)
14、
const成员都是static所以应该去掉static
15、
在vs中运行下可知:
13,10
16、
是2个。
一•个是编译时决定的,最后放在常量池中。
一个是运行时放在堆里面的。
两个都是Mxyz\s只是一个引用,本身不是对象。
17、
sealed修饰符表示密封
用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥
用于方法和属性时,表示该方法或属性不能再被至写,必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员
通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱
恰当的利用sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员
18、
const:
用const修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序
staticreadonly:
用staticreadonly修饰符声明的成员依然是变昂;,只不过具有和常吊:
类似的使用方法:
通过类进行访问、初始化后不可以修改。
但与常量不同的是这种变量是在运行期初始化。
const和staticreadonly的确非常像:
通过类名而不是对象名进行访问,在程式中只读等等。
在多数情况下能混用。
辅助:
二者本质的差别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。
而staticreadonly是在运行时计算出其值的,所以还能通过静态构造函数来斌值。
19、
this:
引用总是指向调用成员方法的对象本身。
20、
ArrayListarraylist=newArrayList();
for(inti=O;ivarray.size();i++)
(
an*ayList.add(array,get(i));
)
遍历,逐个添加。
21、
垃圾收集器、可以在程序中显式地使用System.gcO/System.GC.Collect()来强制进行一次立叩的内存清理。
22、
继承:
就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,封装:
特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。
多态:
对象的多态性是指在一•般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。
23、
声明由5个Student对象组成的数组
24、
classtest
(
publicstringName;
publicboolEquals(testn)
(
if(this.Name一一n.Name)
(
returntrue;
}
else
(
rcturnfalso;
}
classprogram
(
staticvoidMain(string[]args)
(
testtl=newtest();
testt2=newtest();
11.Name="a”;
t2.Name="a”;
//tl.Equals(t2);
Console.WriteLine(tl.Equals(t2));
Console.ReadLineO;
)
25、
classShape
{
publicvirtualvoidcalculatearea();
}
classCircle:
Shape
(
publicoverridevoidcalculatearea()
(
while(true)
(
try
(
Console.WriteLine("请输入半径
doubler=Convert.lbDouble(Console.ReadLine());
if(check(r)==1)
(
Console.WriteLine(H半径为{0}的圆形,面积{1}\rzMath.PI*(r*r));break;
)
elsethrownewException();
carrhmxcepi-on)
conso-e.w±eL-ne=菩>^帝咨=);
)
)
)
pub--cm一check(doub-er)一f(rvo)
rsumr
e-se
frsum0;
c-assRecarng-e-Shape
pub=coverridevo-dca-cu-aaarea()
wh=e(true)
一ry
conso-e.wrKeunezMB^^J--);
doub-eanconverLTODOUb-e(conso-e.ReadL-ne()b
conso-e.ws-eL一ne(-_*^A^3;
doub-ebHconvert.TODOUb-e(conso-e.ReadL-ne())j
-f(checkrb)1)
f
conso-e.w5eune(.-ii木^osrls^浸S^a-Lak%b);break;
)
e-se
一hrownewExcepuom);
)
ca-ch(Exception)
conso-e.w±eL-ne(--B>f玲薛一--);))
pub--c-n一check(doub-eaCLoub-eb)f
一f(aVo备bv。
)
raum1;
)e-se
rsum
)
)
)
c-assTr-ang-e-Shape
pub=coverridevo-dca-cu-aaa「ea()f
wh=e(-rue)
一ry
conso-e.wr--eL-ne3wB>Ml^s*=~doub-eanconvert.TODOUb-e(conso-e.ReadL-ne())Jconso-e.wmeL-ne3M^>Mn条皆--);doub-ebHconvert.7bDoub-e(conso-e.ReadL-ne());Conso-e.wmeL-ne3*B>^lll^&,=);doub-ecnconvelt.TODOUb-e(conso-e.ReadL-neo);-f(check(akc)R1)
f
doub-epH(a+b+c)、2jconso-e.wmeLme=sy>M0§」2§lll»J^3弟(3H9prMaih.sqrt(p*p,a)*p&*p,c)));break;
)
e-se
f
ihrownewExcep一一Ono;
catch(Exception)
{
Console.WriteLine("输入不合法!
");
}
)
}
publicintcheck(doublea,doubleb,doublec)
(
if((a>0)&&(b>0)&&(c>0)&&(a+b>c)&&(b+c>a)&&(c+a>b))
{
return1;
}
else
(
return0;
)
)
}
)