大一下 C++考核题

大一下学期校软C++试题

一:判断题(对的填√,错的填×)

  1. delete会调用每一个成员的析构函数,而delete[] 只会调用一次析构函数。(×)

    • delete只会调用一次析构函数,delete[]会调用数组中每一个元素的析构数
    • new 与 delete 配套 new[] 与 delete[] 配套
  2. 可以建立int,float,double和数组的引用但不能定义指向引用的指针。(×)

    c++中,引用可以说只是某个变量的别名,所谓别名,是和指针类型区分开的:指针类型也可以指向某个变量,但指针类型本身也是一个变量,而引用实际上不是一个变量。更本质来说,可以理解为引用没有自身的地址,不占用内存空间(这里为了简化问题可以这样考虑)。因此,声明引用数组没有办法分配空间,因为根本就没有空间可以分配给引用。所以不能声明和定义引用数组

    • 引用 没有内存,没有地址,只是一个变量的别名,

    • 而指针的定义是需要地址的所以无法定义指向引用的指针

  3. 类的static成员:类的全局变量,被类的所有对象共享,包括派生类的对象,能在构造函数内初始化,也可以用const修饰的static数据成员在类内初始化。(√)

用static修饰类的数据成员实际使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象。因此,static成员必须在类外进行初始化,而不能在构造函数内进行初始化,不过也可以用const修饰static数据成员在类内初始化 。

  1. struct和class都可以定义类,struct定义类的成员默认是共有的,而class类定义的成员默认是私有的。,但在继承的的时候,class定义类和struct定义类都是默认private继承。(×)
    • struct 默认是public继承
    • class 默认是private继承
  2. C++大部分的运算符都可以重载如+= -= / * << >>以及 ::等。(×)
    • 有五个运算符不能重载 .     .*     ::     ?:
  3. 构造函数的名字与类名相同,可以重载,可以写成虚函数,但不能显式调用构造函数。(×)
  4. 将类的一个对象赋值给该类的另一个对象时会调用拷贝构造函数 。(×)
    • a(b) 会调用拷贝构造函数 ,a=b 可以重载赋值符

二:选择题

  1. 在C++中,要实现动态联编,必须使用(D)调用虚函数。

    A.类名 B.派生类指针 C.对象名 D.基类指针

    虚函数与动态联编

    实现动态联编用父类指针引用指向子类对象

  2. 下列有关继承和派生的叙述中,正确的是(C)

    A 派生类不能访问通过私有继承的基类的保护成员

    • private继承就是把基类中的public和protect成员变成派生类中的private

      派生类自身是可以访问自己的private成员的

    • 三种继承的区别

    B 多继承的虚基类不能够实例化

    C 如果基类没有默认构造函数,派生类就应当声明带形参的构造函数

    在派生类的构造函数中未显示调用基类的构造函数,此时基类的默认构造函数会被调用

    //因此,如果基类没有默认构造函数,而派生类又不显示调用基类的默认构造函数

    默认构造函数

    D 基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现

    可以被继承

  3. 下列关于this指针的说法正确的是(B)

    A this指针存在于每个函数之中

    • this指针是存在与类的成员函数中

    B在类的非静态函数中this指针指向调用该函数的对象

    C this指针是指向虚函数表的指针

    D this指针是指向类的函数成员的指针

    this是一个指针,它时时刻刻指向你这个实例本身

  4. 有如下程序:

#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对象的指针,当作用域完毕的时候

    系统会销毁指针,而不是指向的对象,所以不会调用析构函数。

三:填空题

  1. 在多态性的实现中,在基类与派生类的虚函数除名字相同外,____也必须相同。

    • 同名 同参数 同返回类型
  2. 有如下程序:

#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

  1. 将x+y中的+运算符用友元函数重载应声明为_______

    • friend T operator+( const T &a, const T &b );
  2. 有下类定义 ,代码填空

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]
  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指向的内存空间并调用析构函数


posted @ 2019-03-14 16:01  lukelmouse  阅读(660)  评论(0编辑  收藏  举报