• 扩大
    缩小

    面向对象程序设计作业易错点

    面向对象程序设计作业4:类和对象的基础

    1.  结构体类型本身不占用内存空间,结构体变量占用内存空间。T

    2.  对于结构数组s,既可以引用数组的元素s[i],也可以引用s[i]中的结构成员。T

    3.  假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 *p.num = 100; 是错误的。T

          *(p).num = 100;     p->num;

    4.  C++程序中,一个类的构造函数可以被重载  一个类的析构函数不可以被重载  T

    5.  point (*p)[3];point是类名,p为定义指向对象数组的指针 。T

         point *p[3];point是类名,p为对象指针数组。T

    point (*p)[3];
    //这里point是类名,p是指向对象数组的指针
    //因为这里的p和*是结合在一起的,是一个指针
    point* p[3];
    //这里point是类名,p是一个指针数组(有三个元素,每个元素是point对象指针)
    //因为[]的优先级大于*的优先级!

    string name;
    int age;

    //方法 Ⅰ

    Student *p[3];//这里的p是指针数组,是一个数组
    for(int i=0;i<3;i++){
    cin>>name>>age;
    p[i] = new Student(name,age);//p[i]是指针
    p[i]->AvgScore();
    }

    //方法 Ⅱ

    Student *p = new Student[3];//这里的p是指针
    for(int i=0;i<3;i++){
    cin>>name>>age;
    p[i] = Student(name,age);//这里的p[i]是数组中的元素,即对象。
    p[i].AvgScore();
    }

     6.  对于以下结构定义,++p->str中的++加在____。A
    struct {
        int len;
        char *str;
    } *p;
    
     
    A.指针str上
    B.指针p上
    C.str指的内容上
     
    7.  
    CSample array[2] = {12};
     调用其构造函数时,array[0]有参数12传入,array[1]无参数传入
     
    8.  

    有如下程序:请写出程序输出结果。

    class Test
    {
    public:
        Test(){cout<<"构造函数"<<endl;}        
        ~Test(){cout<<"析构函数"<<endl;}    
    };
    void myfunc(){
        Test obj;
    }
    int main()
    {
        cout<<"main开始"<<endl;
        myfunc();
        cout<<"main结束"<<endl;
        return 0;
    }
     

    面向对象程序设计作业5:构造函数、析构函数、静态成员、友元

    静态成员static   

    同一个类不同成员间可以公用一个变量/函数

    即 静态数据成员(用时需要在类体外声明) 静态成员函数

    静态成员用以解决同一个类的不同对象之间成员,包括数据成员和函数成员的共享问题。

    常成员const

    常数据成员的值必须初始化,且不能改变

    常成员函数不能修改任何数据成员

    类名 const t1;    const 类名 t1;    void t1() const;    const int t1;

    常量指针 const int *p = &a  p地址可改,指向的值不可改

    指针常量 int* const p = &a  p地址不可改,指向的值可改

     

    在什么情况下系统会调用拷贝构造函数:(三种情况)
    (1)用类的一个对象去初始化另一个对象
    (2)当函数的形参是类的对象时(也就是值传递时),如果是引用传递则不会调用
    (3)当函数的返回值是类的对象或引用时

       MyClass(const MyClass& x);

     

    1.  如果A是B的友元类,那么B的成员函数可以访问A的私有成员。F

    2.  常量对象可以使用常量成员函数。T

    3.  当用一个对象去初始化同类的另一个对象时,要调用拷贝构造函数。T

    4.  对象间赋值将调用拷贝构造函数。F

    5.  若new一个对象数组,那么用delete释放时应该写[],否则只delete一个对象(调用一次析构函数)。T

    6.  静态成员变量的访问控制权限没有意义,静态成员变量均作为公有成员使用。F

    7.  静态成员函数的实现必须在类体外实现,不能在类体内实现。F

    8.  常成员函数既可以被常对象调用,也可以被非常对象调用。T

    9.  当将一个类S定义为另一个类A的友元类时,类S的所有成员函数都可以直接访问类A的所有成员。T

    10.每个对象都有一个指向自身的指针,称为 this 指针,通过使用它来确定其自身的地址。T

     

    11.  在下面有关静态成员函数的描述中,正确的是()。A

    A.在建立对象前,就可以为静态数据成员赋值
    B.静态成员函数在类外定义时要用static前缀
    C.静态成员函数只能在类外定义
    D.在静态成员函数中可以使用this指针
     

    12.  对于常成员函数,下面描述正确的是()A

    A.常成员函数不能修改任何数据成员
    B.常成员函数只能修改一般数据成员
    C.常成员函数只能修改常数据成员
    D.常成员函数只能修改常对象的数据成员
     

    13.  假定MyClass为一个类,则该类的复制构造函数的声明语句为()C

    A.MyClass(int x)
    B.MyClass(MyClass x)
    C.MyClass(const MyClass& x);
    D.MyClass(MyClass *x)
    拷贝构造函数就是为了防止浅拷贝,所以必须通过引用来传地址,最好是常引用,可以保证地址不被改变
    拷贝构造函数也是构造函数,所以没有返回值。
     

    14.  以下对类A的定义,哪个是正确的? B

    A.class A{ private:int v; public:void fun(){} }
    B.class A{ int v; A * next; void fun(){} };
    C.class A{ int v; public: void fun(); }; A::void fun(){}
    D.class A{ int v; public: A next; void fun(){} };
    A:类定义}后面加 ;  ,C:void A::fun(){ },  D:A next不对
     

    15.  给定以下类声明,哪个成员函数可能改变成员变量data? D

    class A {

    public:

     void f1 (int d);
     void f2 (const int &d);
     void f3 (int d) const;
    
     

    private:

       int data;
    
     

    };

    A.f1
    B.f2
    C.f3
    D.f1和f2
     

    16.  设类AA已定义,假设以下语句全部合法,哪些语句会触发调用拷贝构造函数( )。D

    AA a, b; //1
    AA c(10, 20); //2
    AA d(c); //3
    AA e = d; //4
    
     
    A.2
    B.3
    C.4
    D.3 和 4
     

    17.  不能作为函数重载判断依据的是( )A

    A.返回类型
    B.const
    C.参数个数
    D.参数类型
     

    18.  对于C++结构体中定义的成员,其隐含的访问权限为( )A

    A.public
    B.protected
    C.private
    D.static
     
     

    面向对象程序设计作业6:运算符重载

    1.  多数运算符可以重载,个别运算符不能重载,运算符重载是通过函数定义实现的。T

    2.  对每个可重载的运算符来讲,它既可以重载为友元函数,又可以重载为成员函数,还可以重载为非成员函数。F

    3.  对单目运算符重载为友元函数时,可以说明一个形参。而重载为成员函数时,不能显式说明形参。T

    4.  重载为成员函数时,参数个数为运算符数目减一。重载为友元函数时,参数个数为运算符数目。T

    5.  赋值运算符“ =”只能重载为成员函数。T

    6.  重载运算符()、[]、->或者=赋值运算符,运算符重载函数必须声明为类的成员函数。T

     

    7.  下列运算符中,( )运算符不能重载。C

    A.&&
    B.[ ]
    C.::
    D.<<
    不能重载的5个运算符   .   *   ::   sizeof   ?:
     

    8.  为了能出现在赋值表达式的左右两边,重载的"[]"运算符应定义为:B

    A.A operator [ ] (int);
    B.A& operator [ ] (int);
    C.const A operator [ ] (int);
    D.以上答案都不对
     

    9.  能用友元函数重载的运算符是()。A

    A.+
    B.=
    C.[]
    D.->
     

    10.  如何区分自增运算符重载的前置形式和后置形式?B

    A.重载时,前置形式的函数名是++operator,后置形式的函数名是operator ++
    B.后置形式比前置形式多一个 int 类型的参数
    C.无法区分,使用时不管前置形式还是后置形式,都调用相同的重载函数
    D.前置形式比后置形式多一个 int 类型的参数
     
     

    面向对象程序设计作业7:继承和多态

    1.  将构造函数说明为纯虚函数是没有意义的。T

    2.  动态绑定是在运行时选定调用的成员函数的。T

    3.  因为静态成员函数不能是虚函数,所以它们不能实现多态。T

    4.  如果函数的参数是基类对象或基类对象的引用,函数调用时的实参可以是派生类对象。T

    5.  在多继承中,派生类的构造函数需要依次调用其基类的构造函数,调用顺序取决于定义派生类时所指定的各基类的顺序。T

    6.  派生类中的虚函数,不仅可以覆盖基类的虚函数,还会隐藏基类中同名函数的所有其它重载形式。T

    7.  类的组合关系可以用“Has-A”描述;类间的继承与派生关系可以用“Is-A”描述。T

    8.  通过基类指针调用基类和派生类中的同名虚函数时,若该指针指向一个基类的对象,那么被调用的是基类的虚函数。T

    9.  通过基类引用调用基类和派生类中的同名虚函数时,若该引用引用的是一个基类的对象,那么被调用的是基类的虚函数。T

    10.通过基类引用调用基类和派生类中的同名虚函数时,若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数。T

    11.虚函数既可以在函数说明时定义,也可以在函数实现时定义。F

         只能在函数说明时定义

     

    12. 关于动态绑定的下列描述中,( )是错误的。D

    A.动态绑定是以虚函数为基础的
    B.动态绑定在运行时确定所调用的函数代码
    C.动态绑定调用函数操作是通过指向对象的指针或对象引用来实现的
    D.动态绑定是在编译时确定操作函数的
     

    13. 多继承是指()。A

    A.一个派生类同时继承多个基类
    B.多个派生类同时继承一个基类
    C.基类本身又是一个更高一级基类的派生类
    D.派生类本身又是更低一级派生类的基类
     

    14. 下面函数原型声明中,()声明了fun为普通虚函数。C

    A.void fun()=0;
    B.virtual void fun()=0;
    C.virtual void fun();
    D.virtual void fun(){}
     

    15. 在创建派生类对象时,构造函数的执行顺序是( )。B

    A.对象成员构造函数、基类构造函数、派生类本身的构造函数
    B.基类构造函数、对象成员构造函数、派生类本身的构造函数
    C.基类构造函数、派生类本身的构造函数、对象成员构造函数
    D.派生类本身的构造函数、基类构造函数、对象成员构造函数
     

    16. 在公有继承的情况下,在派生类中能够访问的基类成员包括 D

    A.公有成员
    B.保护成员
    C.公有成员、保护成员和私有成员
    D.公有成员和保护成员
     

    17. 下面叙述不正确的是 A

    A.基类的保护成员在派生类中仍然是保护的成员
    B.基类的保护成员在公有派生类中仍然是保护的
    C.基类的保护成员在私有派生类中仍然是私有的
    D.对基类成员的访问必须是无二义性
     

    18. 下面关于类的继承与派生的程序,其输出结果是 D

     
    #include<iostream>
    using namespace std;
    class A
    {
    public:
        A(){cout<<"A";}
    };
    class B
    {
    public:
        B(){cout<<"B";}
    };
    class C:public A
    {
        B b;
    public:
        C(){cout<<"C";}
    };
    int main(){
        C obj;
        return 0;
    }
    
     
    A.CBA
    B.BAC
    C.ACB
    D.ABC
     

    19. 下列有关类型兼容规则的描述中,错误的是:D

    A.派生类的对象可以隐含转换为基类对象
    B.派生类的对象可以初始化基类的引用
    C.派生类的指针可以隐含转换为基类的指针
    D.派生类的对象可以被基类的对象初始化
     

    20. 以下说法不正确的是(假设在公有派生情况)?A

    A.可以将基类对象赋值给派生类对象
    B.可以将派生类对象的地址赋值给基类指针
    C.可以将派生类对象赋值给基类的引用
    D.可以将派生类对象赋值给基类对象
     

    21. 类定义如下:

    class A{  

    public: virtual void func1( ){ }   

                void func2( ){ } }; 

    class B:public A{ 

    public:  void func1( ) {cout<<”class B func1”<<endl;}   

                  virtual void func2( ) {cout<<”class B func2”<<endl;} }; 

    则下面正确的叙述是( )C

    A.A::func2( )和B::func1( )都是虚函数
    B.A::func2( )和B::func1( )都不是虚函数
    C.B::func1( )是虚函数,而A::func2( )不是虚函数
    D.B::func1( )不是虚函数,而A::func2( )是虚函数 
     
     

    posted on 2022-06-25 13:16  Ancientea  阅读(1969)  评论(0)    收藏  举报

    导航