任务五 同步训练
知识点
一、选择题
1. 在C#中,类的成员包括( )。
- A. 属性和方法
- B. 构造函数和析构函数
- C. 属性和变量
- D. 构造函数和变量
答案:A。类的成员包括字段(数据成员)、属性(访问器成员)和方法(行为成员),此外还包括构造函数等。属性和方法是类最重要的成员。
2. 在C#中,方法的参数有( )类型。
- A. 值参数
- B. 引用参数
- C. 输出参数
- D. 都正确
答案:D。C#支持四种参数类型:值参数、引用参数(ref)、输出参数(out)、数组参数(params)。
3. 下列关于类的描述中,错误的是( )。
- A. 类是面向过程编程的核心
- B. 类是创建对象的模板
- C. 类代表现实世界中的"种类"
- D. 类是具有共同行为的若干对象的统一描述体
答案:A。类是面向对象编程的核心,不是面向过程编程的核心。
4. 下列关于对象的描述中,错误的是( )。
- A. 对象是类的一个实例
- B. 可以通过使用new操作符创建类的对象
- C. 对象没有生命周期
- D. 对象是现实世界中客观存在的某种实体
答案:C。对象有生命周期,包括创建、使用、不可访问、垃圾回收、销毁五个阶段。
5. 下列关于方法的参数描述中,错误的是( )。
- A. 值参数在传递时不影响原始变量
- B. ref关键字只对跟在它后面的参数有效
- C. params参数适用于一维数组
- D. out关键字和ref关键字使用完全相同
答案:D。out和ref有关键区别:ref参数在调用前必须赋值,out参数在调用前可以不用赋值;out参数用于返回多个值。
6. 下列关于this的描述中,错误的是( )。
- A. 可以通过this关键字访问当前对象的属性
- B. this指针是指向对象的
- C. 可以通过this关键字访问当前对象的方法
- D. this指针只能隐含使用,不能显式使用
答案:D。this关键字既可以隐含使用,也可以显式使用。显式使用this可以消除成员名称的歧义。
7. 下列关于构造函数的说法,错误的是( )。
- A. 构造函数的函数名和类名相同
- B. 构造函数可以重载
- C. 构造函数可以带有参数
- D. 可以指定构造函数的返回值
答案:D。构造函数没有返回类型,包括void,不能指定返回值。
二、填空题
1. 在C#中,使用 ________ 关键字来创建一个对象。
答案:new。使用
new操作符创建对象,如Person p = new Person()。
2. 在C#中,使用 ________ 关键字来调用一个实例方法。
答案:对象名(或this)。通过"对象.方法名()"调用实例方法,在类内部也可用
this关键字。
3. 在C#中,使用 ________ 关键字来调用一个静态方法。
答案:类名。静态方法通过类名直接调用,如
MyClass.MyStaticMethod()。
4. 类的数据成员可以分为 ________ 成员和 ________ 成员。
答案:静态;实例。静态成员属于类,实例成员属于对象实例。
5. 类是面向 ________ 编程(OOP)的基本概念之一,它是一种抽象数据类型。
答案:对象。OOP = Object-Oriented Programming,面向对象编程。
三、判断题
1. 类的数据成员不一定都是私有的。( )
答案:正确(√)。字段可以是公共的(public)、私有的(private)或受保护的(protected)。
2. this关键字可以用于访问静态属性。( )
答案:错误(×)。this关键字引用当前对象的实例成员,静态成员属于类,不通过this访问。
3. 方法提供读取和写入的控制,有get和set访问器。( )
答案:错误(×)。get和set访问器是属性的特性,不是方法的特性。方法是执行操作的代码块。
4. 运算符new可以创建对象,也可以创建对象数组。( )
答案:正确(√)。new既可创建单个对象
new Person(),也可创建数组new int[5]。
5. 没有参数的构造函数称为默认构造函数,该构造函数一定是系统自动生成的。( )
答案:错误(×)。无参构造函数可以由程序员手动编写,不一定是系统自动生成的。
四、简答题
1. 什么叫类?什么叫对象?二者是什么关系?
答:
- 类:类是面向对象编程的基本概念,是一种抽象数据类型,定义了对象的属性(字段)和行为(方法),是同一类事物的统称。
- 对象:对象是类的实例,是现实世界中客观存在的某种实体,通过类来创建。
- 关系:类是创建对象的模板(蓝图),对象是类的具体实例。类是抽象的,对象是具体的。一个类可以创建多个对象。
2. 简要说明按值传递参数、按引用传递参数的区别。
答:
- 按值传递(值参数):将实参的值复制到形参中,形参的修改不会影响原始变量。
- 按引用传递(ref参数):将实参的引用传递给形参,形参的修改会反映到原始变量中。
- 区别:按值传递时实参不被修改,按引用传递时实参会被修改;ref参数在调用前必须赋值。
五、程序改错题
题目: 小明编写以下程序,想要实现将变量a与变量b中两个数进行交换,可为何数据没有发生变化呢?有两处错误,请指出并改正。
class Program
{
static void Main(string[] args)
{
int a = 10, b = 20;
Console.WriteLine("交换前两个数: {0}和{1}", a, b);
Swap(a, b);
Console.WriteLine("交换后两个数: {0}和{1}", a, b);
Console.ReadLine();
}
static void Swap(int a, int b)
{
int c;
c = a;
a = b;
b = c;
}
}
改错分析:
错误1:
Swap方法的参数使用的是值参数,按值传递不会影响原始变量。应改为ref引用参数。错误2:调用
Swap方法时也需要添加ref关键字。改正后的代码:
static void Main(string[] args){int a = 10, b = 20;Console.WriteLine("交换前两个数: {0}和{1}", a, b);Swap(ref a, ref b); // 改正:添加ref关键字Console.WriteLine("交换后两个数: {0}和{1}", a, b);Console.ReadLine();}static void Swap(ref int a, ref int b) // 改正:添加ref关键字{int c;c = a;a = b;b = c;}
六、程序分析题
题目: 运行以下程序,控制台上会输出什么结果?
public class Swimming
{
public static void Main(string[] args)
{
Swimming a = new Swimming();
Swimming b = new Swimming("小明", 6);
}
public Swimming()
{
Console.WriteLine("游泳每人每次30元");
}
public Swimming(string name, int a)
{
Console.WriteLine(name + "," + a + "级贵宾卡客户,可享受" + a + "折优惠");
}
}
运行结果:
游泳每人每次30元小明,6级贵宾卡客户,可享受6折优惠分析:
new Swimming()调用无参构造函数,输出"游泳每人每次30元"new Swimming("小明", 6)调用有参构造函数(构造函数重载),输出"小明,6级贵宾卡客户,可享受6折优惠"