北京大学程序设计MOOC作业详解-02-类和对象基础
第一题
第一题分析:
这个题考察点是:一个类的默认无参构造函数。一个类,如果不写有参/无参的普通构造函数,则会有一个默认的无参构造。但是如果写了有参/无参构造函数,那么就不会有这个默认的无参构造了。
然而,B,C和D选项均使用了无参构造,这是错误的,因此本题选A。
第二题:
第二题分析:
首先,arr是一个指针数组,即数组内的元素均为指针。指针在没有调用new和构造函数的时候,只是一个空/野的指针变量,占固定的8个字节。只有new了才是实例化的对象。
这个数组里,只有两个new,因此只有两个对象,本题选C。
第三题:
第三题分析:
这题考察:拷贝构造函数调用的时机,在不考虑优化的情况下,有以下时机会调用拷贝构造:
1)运用拷贝构造初始化对象时,即:A a2 = a1;
,要注意这种情况:A a2; a2=a1;
这里没有调用拷贝构造,而是调用了一次无参构造和一次赋值运算符。
2)函数传参传递了一个非引用/指针类型的实参,即:void func1(A a){} func1(a1);
,这里可以看作:A a=a1;
根据1)可知,调用拷贝构造。
3)函数返回值返回了一个非引用/指针类型的实参,即:A func2(){} A a1=func2();
,根据1)可知,这也相当于A a1=a;
。
根据上述三种调用拷贝构造的时机,可以知道,本题选A。因为,A选项是无参构造+赋值运算符。但是B选项也不是很对,因为拷贝构造是运行时的,只有函数实现,没有函数调用,是不存在拷贝构造的。
第四题:
第四题分析:
本题考察类型转换构造函数,什么叫类型转换呢?其实没有这种概念,一般就叫构造函数。需要注意explicit关键字,写了这个关键字就不支持类型转换构造了。比如:
class A {
private:
int m_val;
public:
A(int val) : m_val(val) {}
};
int main() {
A a = 1;// 这里会调用类型转换构造,而并非拷贝构造匿名对象
/*
如果是:
explicit A(int val) : m_val(val) {}
那么就不支持:
A a = 1;
*/
return 0;
}
这里会调用类型转换构造,而并非拷贝构造匿名对象。好了,言归正传,本题选项分析:
A选项:a3=9
这行代码,包含两步,首先是调用赋值构造,得到A(9)的匿名对象,然后调用赋值操作函数,赋值给a3对象。
B选项:这里也可以说是调用赋值构造,因为赋值构造,本质就是一个普通的构造函数。
C选项:这是典型的赋值构造,和上面的代码例子是一样的。
D选项:第一行代码,有两次无参构造函数调用;第二行代码,调用赋值操作符函数,因此该选项没有调用赋值构造。
因此,本题选D。
第五题:
第五题分析:
这个程序首先会调用delete[] p,这是2次析构,因为p是一个大小为2的指针数组,且里面2个元素均实例化(new A[2])。然后在作用域结束后,A a实例化的这个a变量会析构,又是1次。因此,调用3次析构,本题选C。需要注意,new出来的变量,必须delete析构,如果是new T[]则必须是delete[] 析构。
第六题:
第六题分析:
设计一个类,需要包括类的属性(成员变量)和方法(成员函数)。根据题目的输出要求可知,这个类要包含:姓名,年龄,学号和四年平均成绩。值得注意的是,四年平均成绩不一定是整数。即:姓名(name,string),年龄(age,int),学号(stuId, string),平均成绩(score,double)。然后方法就是题目给出的三个方法要实现。
但是,为了业务,可能还需要保留四年每一年的成绩,这需要增加四个成员变量。这个题建议用strtok分割字符串,分割字符串一直是C/C++的一个不足,明天再探索。