大一下 C++考核题
大一下学期校软C++试题
一:判断题(对的填√,错的填×)
-
delete会调用每一个成员的析构函数,而delete[] 只会调用一次析构函数。(×)
- delete只会调用一次析构函数,delete[]会调用数组中每一个元素的析构数
- new 与 delete 配套 new[] 与 delete[] 配套
-
可以建立int,float,double和数组的引用但不能定义指向引用的指针。(×)
c++中,引用可以说只是某个变量的别名,所谓别名,是和指针类型区分开的:指针类型也可以指向某个变量,但指针类型本身也是一个变量,而引用实际上不是一个变量。更本质来说,可以理解为引用没有自身的地址,不占用内存空间(这里为了简化问题可以这样考虑)。因此,声明引用数组没有办法分配空间,因为根本就没有空间可以分配给引用。所以不能声明和定义引用数组
-
引用 没有内存,没有地址,只是一个变量的别名,
-
而指针的定义是需要地址的所以无法定义指向引用的指针
-
-
类的static成员:类的全局变量,被类的所有对象共享,包括派生类的对象,能在构造函数内初始化,也可以用const修饰的static数据成员在类内初始化。(√)
用static修饰类的数据成员实际使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象。因此,static成员必须在类外进行初始化,而不能在构造函数内进行初始化,不过也可以用const修饰static数据成员在类内初始化 。
- struct和class都可以定义类,struct定义类的成员默认是共有的,而class类定义的成员默认是私有的。,但在继承的的时候,class定义类和struct定义类都是默认private继承。(×)
- struct 默认是public继承
- class 默认是private继承
- C++大部分的运算符都可以重载如+= -= / * << >>以及 ::等。(×)
- 有五个运算符不能重载 . .* :: ?:
- 构造函数的名字与类名相同,可以重载,可以写成虚函数,但不能显式调用构造函数。(×)
- 构造函数不能是虚函数
- 可以显示调用构造函数 比如拷贝构造函数
- 将类的一个对象赋值给该类的另一个对象时会调用拷贝构造函数 。(×)
- a(b) 会调用拷贝构造函数 ,a=b 可以重载赋值符
二:选择题
-
在C++中,要实现动态联编,必须使用(D)调用虚函数。
A.类名 B.派生类指针 C.对象名 D.基类指针
实现动态联编用父类指针或引用指向子类对象
-
下列有关继承和派生的叙述中,正确的是(C)
A 派生类不能访问通过私有继承的基类的保护成员
-
private继承就是把基类中的public和protect成员变成派生类中的private
派生类自身是可以访问自己的private成员的
B 多继承的虚基类不能够实例化
-
实例化就是 产生 多继承的虚基类的对象,显然是可以的
C 如果基类没有默认构造函数,派生类就应当声明带形参的构造函数
在派生类的构造函数中未显示调用基类的构造函数,此时基类的默认构造函数会被调用
//因此,如果基类没有默认构造函数,而派生类又不显示调用基类的默认构造函数
D 基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现
可以被继承
-
-
下列关于this指针的说法正确的是(B)
A this指针存在于每个函数之中
- this指针是存在与类的成员函数中
B在类的非静态函数中this指针指向调用该函数的对象
C this指针是指向虚函数表的指针
D this指针是指向类的函数成员的指针
this是一个指针,它时时刻刻指向你这个实例本身
-
有如下程序:
#include<iostream>
using namespace std;
class Test{
public:
Test(){}
~Test(){
cout<<'#';
}
};
int main(){
Test temp[2], *pTemp[2];
return 0;
}
执行这个程序输出星号(#)的个数为(B)
A)1 B) 2 C)3 D)4
-
析构的时候,temp[2] 的每一个元素调用一次析构函数 输出 ##
*pTemp[2]是一个指针数组,里面包含两个指向 Test对象的指针,当作用域完毕的时候
系统会销毁指针,而不是指向的对象,所以不会调用析构函数。
三:填空题
-
在多态性的实现中,在基类与派生类的虚函数除名字相同外,____也必须相同。
- 同名 同参数 同返回类型
-
有如下程序:
#include<iostream>
using namespace std;
class MyClass{
public:
MyClass(int i=0){cout<<1;}
MyClass(const MyClass&x){cout<<2;}
MyClass& operator=(const MyClass&x)
{cout<<3; return *this;}
~MyClass(){cout<<4;} };
int main(){
MyClass obj1(1),obj2(2),obj3(obj1);
obj1=obj2;
return 0;
}
运行时的输出结果是________________ (1123444)
-
obj1(1) 调用默认构造函数 输出 1
obj2(2) 调用默认构造函数 输出 1
obj3(obj1) 调用拷贝构造函数 输出 2
obj1 = obj2 重载 = 输出 3
析构的时候倒着来 输出 444
-
将x+y中的+运算符用友元函数重载应声明为_______
- friend T operator+( const T &a, const T &b );
-
有下类定义 ,代码填空
Class A {
Char *a;
Public:
A():a(0){}
A(char *aa) {
a=__________________; //把aa所指字符串拷贝到a所指向的存储空间
Strcpy(a,aa);
~A() {delete [] a;}
};
a = new char[strlen(aa)+1]
- 请将下列程序补充完整,使得输出结果为“Destructor Derived Destructor Base”。
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base(){ cout << "Destructor Base"<< endl; }
};
class Derived : public Base {
public:
________________________;}//显然这里缺一个析构函数(输出题目的上半段话)
};
int main () {
Base *pBase = new Derived; //这里定义了一个指向 Derived类型对象的指针
______________________ ; //析构函数调用的时候,和构造函数是反着来的,就像一个栈
// 先构造 Base 再构造Derived ,所以析构的时候,出栈的第一个就是Derived的析构,
// 然后是 Base 的析构
return 0;
}
public:
virtual ~Derived(){ cout<<"Destructor Derived "};
----------------------------------------------------------
delete pBase; //delete可以释放pBase指向的内存空间并调用析构函数