跳到主要内容

任务五 同步训练

知识点​

一、选择题​

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折优惠"