精华内容
下载资源
问答
  • c++中 在头文件中写一个抽象类,对于其构造函数,我也定义在头文件中,但是定义的位置是在类外。 再写一个抽象类的子类,并用子类实例化对象。 出现了多重定义的问题,各位大大,能指教一下吗?
  • 一、单选题 2-1在的定义中,用于为对象分配内存空间,对的数据成员进行初始化并执行其他内部管理操作的函数是 C A 友元函数 B 虚函数 C 构造函数 D 析构函数 2-2的析构函数的作用是 D...C 是对某一对象的抽象

    一、单选题
    2-1在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数是 C
    A 友元函数
    B 虚函数
    C 构造函数
    D 析构函数

    2-2类的析构函数的作用是 D
    A 一般成员函数的初始化
    B 类的初始化
    C 对象的初始化
    D 删除类创建的对象

    2-3下列函数中,( C )不能重载。
    A 成员函数
    B 非成员函数
    C 析构函数
    D 构造函数

    2-4下列关于类和对象的叙述中,错误的是 A
    A 一个类只能有一个对象
    B 对象是类的具体实例
    C 类是对某一类对象的抽象
    D 类和对象的关系是一种数据类型与变量的关系

    2-5下列属于类的析构函数特征的是 A
    A 一个类中只能定义一个析构函数
    B 析构函数名与类名不同
    C 析构函数的定义只能在类体内
    D 析构函数可以有一个或多个参数

    2-6下列关于类定义的说法中,正确的是 A
    A 类定义中包括数据成员和函数成员的声明
    B 类成员的缺省访问权限是保护的
    C 数据成员必须被声明为私有的
    D 成员函数只能在类体外进行定义

    2-7假设MyClass是一个类,则该类的拷贝初始化构造函数的声明语句为( ) C
    A MyClass&(MyClass x);
    B MyClass(MyClass x);
    C MyClass(MyClass &x);
    D MyClass(MyClass *x);

    2-8下列关于类的构造函数的描述中,错误的是 D
    A 类的构造函数可以重载
    B 类可以没有构造函数
    C 类的构造函数可以缺省
    D 类的构造函数可以作为其它类型向本类类型进行转换的函数
    此答案报错

    2-9下列对重载函数的描述中,( A )是错误的。
    A 重载函数中不允许使用默认参数
    B 重载函数中编译根据参数表进行选择
    C 不要使用重载函数来描述毫无相干的函数
    D 构造函数重载将会给初始化带来多种方式

    2-10建立一个类对象时,系统自动调用 A
    A 构造函数
    B 析构函数
    C 友元函数
    D 成员函数

    2-11下面程序的运行结果为 C

    #include<iostream.h>
    class A
    {
    public:    
       A(){cout<<"1";}
       ~A(){cout<<"2";}
    };
    class B:public A
    {
    public:
         B(){cout<<"3";}
         ~B(){cout<<"4";}
    };
    void main()
    {  B b; }
    

    A 1234
    B 1324
    C 1342
    D 3142

    2-12类的析构函数是在什么时候调用的? C
    A 类创建时
    B 创建对象时
    C 删除对象时
    D 不自动调用

    2-13 C++提供的可有效分配对象空间的运算符是( ) B

    A delete
    B new
    C pos
    D auto

    2-14对于任意一个类,析构函数的个数最多为( ) B
    A 0
    B 1
    C 2
    D 3

    二、函数题
    6-1 实现数组类(C++ 拷贝构造函数、拷贝函数) (10分)
    裁判测试程序样例中展示的是一段实现“数组类”的代码,其中缺失了部分代码,请补充完整,以保证测试程序正常运行。

    函数接口定义:

    提示:要想程序正确运行,至少需要补充以下函数(可能还需要补充其他函数):
    1. 带参构造函数
    2. 拷贝构造函数
    3. 拷贝函数(赋值运算符重载)
    

    裁判测试程序样例:

    #include <iostream>
    using namespace std;
    class ArrayIndexOutOfBoundsException{  // 异常类
    public:
        int index;
        ArrayIndexOutOfBoundsException(int k){
            index = k;
        }
    };
    class Array{
    private:
        int *data;
        int size;
        static const int dSize = 10;   // 数组默认大小
    public:
        Array( ){  // 无参构造
            size = dSize;
            data = new int[size]( );
        }
    		
    /** 你提交的代码将被嵌在这里(替换本行内容) **/		
    		
        int& operator [] (int k){     // 运算符 [ ] 重载,以方便数组的使用
            if(k<0 || k>=size) throw ArrayIndexOutOfBoundsException(k);
            return data[k];
        }
        friend ostream& operator << (ostream& o, const Array& a);   // 运算符 << 重载,以方便输出
    };
    ostream& operator << (ostream& o, const Array& a){
        o << '[' ;
        for(int i=0; i<a.size-1; i++)
            o << a.data[i] << ',' ;
        o << a.data[a.size-1] << ']';
        return o;
    }
    // 注意:实际测试程序中,在此处之前的代码与样例中相同
    // 注意:实际测试程序中,在此处之后的代码(即main函数)可能与样例中不同
    int main(){
        int n, k;
        cin >> n >> k;
        Array a(n);  // 构造数组,大小为 n
        for(int i=0; i<n; i++) a[i] = i;
        Array b = a;  // 拷贝构造数组
        b[n/2] = k;
        cout << a << endl;
        cout << b << endl;
        Array c;  // 构造数组,默认大小
        c = a; // 拷贝数组
        c[n/2] = k;
        cout << a << endl;
        cout << c << endl;
        a = a;
        a[n/2] = 2223;
        cout << a << endl;
        return 0;
    }
    

    输入样例:

    15 666
    

    输出样例:

    [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
    [0,1,2,3,4,5,6,666,8,9,10,11,12,13,14]
    [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
    [0,1,2,3,4,5,6,666,8,9,10,11,12,13,14]
    [0,1,2,3,4,5,6,2223,8,9,10,11,12,13,14]
    
    Array(int n) 
    {
        size = n;
        data = new int[size]();
    }
    Array(const Array& a) 
    {
        size = a.size;
        data = new int[size];
        for (int i = 0; i < size; i++) 
        {
            data[i] = a.data[i];
        }
    }
    ~Array() 
    {
        delete[] data;
    }
    Array& operator=(const Array& a) 
    {
        if (a.size != size) 
        {
            delete[] data;
            size = a.size;
            data = new int[size];
        }
        for (int i = 0; i < size; i++) 
        {
            data[i] = a.data[i];
        }
        return *this;
    }
    
    展开全文
  • C.126: An abstract class ...C.126:抽象类通常不需要构造函数‍ Reason(原因) An abstract class typically does not have any data for a constructor to initialize. 抽象类通常不包含任何需要构造函数...

    C.126: An abstract class typically doesn't need a constructor

    C.126:抽象类通常不需要构造函数‍

     

    Reason(原因)

    An abstract class typically does not have any data for a constructor to initialize.

    抽象类通常不包含任何需要构造函数初始化的数据。

     

    Example(示例)

    ???
    

     

    Exception(例外)

    • A base class constructor that does work, such as registering an object somewhere, may need a constructor.

    • 执行某些动作的基类的构造函数,例如将对象登录到某处,可能还是需要的。

    • In extremely rare cases, you might find it reasonable for an abstract class to have a bit of data shared by all derived classes (e.g., use statistics data, debug information, etc.); such classes tend to have constructors. But be warned: Such classes also tend to be prone to requiring virtual inheritance.

    • 也存在特别稀少的情况,你可能发现抽象类包含少量被所有派生类共享的数据也是合理的(例如,使用静态数据,调试信息等);这样的类有构造函数会更好些。但是需要注意的是:这样的类也可能要求虚继承。

       

    Enforcement(实施建议)

    Flag abstract classes with constructors.

    对包含构造函数的抽象类进行提示。

     

    原文链接

    https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#chierclass-designing-classes-in-a-hierarchy


     

    觉得本文有帮助?欢迎点赞并分享给更多的人。

    阅读更多更新文章,请关注微信公众号【面向对象思考】

    展开全文
  • C++继承派生类构造函数的写法

    千次阅读 2019-06-16 22:51:01
    C++有三大思想:抽象与封装、继承与派生、多态性,是c++开发人员面对对象编程必须掌握的知识。 初学者对子类继承中构造函数的写法有时会存在一些问题。即子类继承基类时,子类的...②再执行派生类构造函数本身(...

    C++有三大思想:抽象与封装、继承与派生、多态性,是c++开发人员面对对象编程必须掌握的知识。

    初学者对子类继承中构造函数的写法有时会存在一些问题。即子类继承基类时,子类的构造函数如何实现呢?如何调用基类的成员变量?相信大部分初学c++时,都会遇到类似的问题。

    我们都知道继承中,当子类建立一个对象时,执行构造函数的顺序是:

    ①派生类构造函数先调用基类的构造函数

    ②再执行派生类构造函数本身(即派生类构造函数的函数体)

    派生类的构造函数可以大致分为:

    a.简单的派生类的构造函数 

    格式:

    派生类构造函数名(总参数表):基类构造函数名(参数表)

    {

    派生类中新增数据成员初始化语句

    }

    b.有子对象的派生类的构造函数

    格式:

    派生类构造函数名(总参数表):基类构造函数名(参数表),子对象名(参数表)

    {

    派生类中新增数据成员初始化语句

    }

    c.多层派生时的构造函数  

    注意:不是定义基类构造函数,而是调用积累的额构造函数,因此这些参数是实参而不是形参。

     

    下面用代码讲解一下子类构造函数的实现。

    ①定义class A,class B继承class A,class C继承class B:

    class A
    {
    public:
    
    	A(int a1, int b1, char c1);
    	int a;
    	int b;
    	char c;
    };
    class B : public A
    {
    public:
    	B();
    	B(int a1, int b1, char c1);
    };
    class C :public B
    {
    public:
    	C();
    	C(int a1, int b1, char c1);
    };
    

     class A的构造函数实现:

    A::A(int a1, int b1, char c1)
    {
    	a = a1;
    	b = b1;
    	c = c1;
    }

    ②class B的构造函数实现

    B::B() :A(a, b, c)//调用基类的成员变量值
    {
    	a = 20;
    	b = 10;
    	c = 'g';
    }
    B::B(int a1, int b1, char c1) :A(a, b, c)//构造函数的重载
    {
    	a = a1;
    	b = b1;
    	c = c1;
    }

    ③class C的构造函数实现

    C::C() :B()
    {
    
    }
    C::C(int a1, int b1, char c1) : B(a,b,c)
    {
    	a = a1;
    	b = b1;
    	c = c1;
    
    }
    //C::C(int a1, int b1, char c1) : B()//与上面一样
    //{
    //	a = a1;
    //	b = b1;
    //	c = c1;
    //}

    ④main函数代码:

    int main(int argc, char *argv[])
    {
    	A ff(1, 2, 'c');
    	cout << ff.a <<" "<< ff.b <<" "<< ff.c << endl;
    	B b1;
    	cout << b1.a <<" "<< b1.b <<" "<< b1.c << endl;
    	B b2(10,10,'i');
    	cout << b2.a << " " << b2.b << " " << b2.c << endl;
    
    	C c1;
    	cout << c1.a << c1.b << c1.c << endl;
    	C c2(100,100,'u');
    	cout << c2.a << c2.b << c2.c;
    
    	system("pause");
    	return 0;
    }

    结果: 1  2  c

    20 10 g

    10 10 i

    20 10 g

    100 100 u

    展开全文
  • 抽象类构造函数

    万次阅读 2010-10-19 15:31:00
    但很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数(FxCop.设计规则)。但不应该有“公共”的构造函数,和不应该有构造函数,这是两个...

    1、抽象类是可以有构造函数的。但很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数(FxCop.设计规则)。但不应该有“公共”的构造函数,和不应该有构造函数,这是两个不同的概念,所以,FxCop.设计规则中也说,如果抽象类需要构造函数,那么应该声明为“protected”。

    2、既然抽象类是可以,甚至有时候应该有构造函数,那抽象类的构造函数的作用是什么?我觉得至少有两个:

    (1)初始化抽象类的成员;

    (2)为继承自它的子类使用。

    比如以下例子:

     

     

    3、即使我们声明一个没有构造函数的抽象类,编译器还会为我们生成一个默认的保护级别的构造函数。子类实例化时(不管是否为带参构造)只会调用所有父类的无参构造函数,而带参构造必须通过显式去调用.调用顺序是先调用抽象类的无参构造函数,如果子类实例化时是使用带餐的构造函数,则再接着调用抽象类的带参构造函数,最后调用子类本身的构造函数。

     

    展开全文
  • C++构造函数 拷贝构造函数 析构函数 赋值操作
  • C++中的构造函数小结

    千次阅读 2013-09-02 13:57:24
    对象的初始化 对象时的实例,是不占用空间的,对象是占用...构造函数在定义对象的时候,自动执行的对对象中的数据进行初始化操作的函数。 构造函数的作用 构造函数不同于其他的函数,不需要用户调用它(用户也
  • 的数据成员不能在的声明时候初始化,为了解决这个问题,使用构造函数处理对对象的初始化。构造函数是一种特殊的成员函数,与其他函数不同,不需要用户调用它,而是创建对象的时候自动调用。析构函数是对象不再...
  • 抽象类构造函数用来初始化抽象类的一些字段,而这一切都在抽象类的派生类实例化之前发生。不仅如此,抽线类的构造函数还有一种巧妙应用:就是在其内部实现子类必须执行的代码。 以下就是在抽象类构造函数中来...
  • 如题, C++中派生构造函数一定得调用基类的构造函数吗 (小白刚学,大神勿喷)
  • C++C++类和对象、构造函数和析构函数

    千次阅读 多人点赞 2018-06-03 20:32:37
    是对某一事物的抽象描述,具体地讲,C++中的一种构造的数据类型。它即可包含描述事物的数据,又可包含处理这些数据的函数在程序运行时是被用作样板来建立对象的。所以要建立对象,首先必须定义。 定义...
  • 构造函数和析构函数的理解 ...其中如果没有在你定义的中定义一个构造函数,则系统会自动调用什么都不操作的默认构造函数; 2.如果你定义了构造函数,则系统不会调用默认的构造函数给你,比如 #include
  • 抽象类可以有构造函数么?

    千次阅读 2015-03-06 21:48:52
    什么是抽象类 1、被定义为abstract的类称为抽象类 2、类成员函数被定义为abstract的...以上两点看抽象类不能有构造函数,但是大家别忘了,在生成子类对象的时候,子类的构造函数要先调用父类的构造函数。从这一点可以
  • C++静态构造函数

    千次阅读 2019-02-21 23:42:28
    C++静态构造函数 如果数据成员被声明为static,那么它在编译时就必须被初始化。仅含static的则放在之外,实现文件之中;同时含有const的则放在之内,直接跟在数据的定义之后。 在实际代码编写中碰到的问题是:...
  • 抽象类中可以有构造函数

    千次阅读 2017-06-11 16:48:25
    而派生类在实例化调用构造函数的时候会先调用基类中的构造函数,所以抽象类构造函数也是可以被调用的,所以抽象类中可以有构造函数抽象类的析构函数最后是虚析构函数。 比如上面的程序在执行的时候就会执行...
  •  《The C++ ARM》告诉我们:“默认构造函数会在需要的时候自动生成(被编译器)。”然后“在需要的时候”是一个很抽象的概念,本文主要描述的问题也正是这些需要的情况。  我们看看下面的代码片段: ...
  • C++中的抽象函数抽象类

    千次阅读 2019-03-31 21:55:17
    抽象函数指的是没有具体内容的函数,一般用"= 0"修饰,例如: class A{ public: ...抽象类不能被实例化,抽象函数一旦被实例化,则会产生报错 “can not declare variable xx to be abstract type xx...
  • C++构造函数详解

    千次阅读 2016-12-26 15:07:44
    一、概念 1.控制对象初始化过程的一个或几个特殊的成员函数,叫做...1.它的产生:如果没有为显式的定义任一构造函数,那么编译器合适的时候会为我们隐式的定义一个默认构造函数,它又被称为合成的默认构造函数。 2
  • C++函数和纯虚函数抽象类

    千次阅读 2016-08-31 13:31:53
    C++函数和纯虚函数抽象类分析
  • 在Java、C#中有关键词abstract指明抽象函数抽象类,但是在C++中没有这个关键词,很显然,在C++也会需要只需要在基类声明某函数的情况,而不需要写具体的实现,那C++中是如何实现这一功能的,答案是纯虚函数。...
  • C++构造函数

    千次阅读 2018-04-07 19:51:15
    因为不能再声明中对数据成员初始化【并不是一个实体,而是一个抽象类型,并不占用存储空间,显然无法容纳数据】,C++提供了构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不...
  • c++类和对象,构造函数,函数重载,复合。 1. 面向过程和面向对象主要区别可以简单概括为:面向过程的编程是一种直接的编程方法是按照编 程语言的思路考虑问题;面向对象的编程是一种抽象度更高的编程方法,它的...
  • 1、构造函数能不能是虚函数:  1.1从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象...
  • c++抽象类

    千次阅读 多人点赞 2019-04-22 15:36:54
    一、纯虚函数抽象类 前面我们介绍了什么是虚函数,即在某些方法前加上关键字virtual,表示该方法在子类中会被重写。 在一个虚函数的声明语句的分号前加上 =0,就可以将一个虚函数变成纯虚函数,其中,=0只能出现在...
  • C++系列(纯虚函数抽象类

    万次阅读 多人点赞 2017-12-18 15:52:57
    一个含有纯虚函数的类(抽象类)来说,其无法进行实例化 那么,纯虚函数是什么呢??从上面的定义可以看到,纯虚函数就是没有函数体,同时在定义的时候,其函数名后面要加上“= 0”。
  • new一个对象的原理,构造函数的作用,拷贝构造函数的作用,析构函数的作用,的组合问题
  • C++ 抽象类

    2013-05-09 14:24:05
    而对于交通工具这一个基类来说,它的特性是模糊的,广泛的,如果建立一个交通工具类的对象并没有实际意义,为了对这种没有必要能够建立对象的类进行约束,c++引入了抽象类的特性,抽象类的约束控制来源于纯虚函数的...
  • C++ 有参构造函数的三种调用方法

    万次阅读 2018-08-13 15:08:19
    class Test { private: int a; int b; ... //带参数的构造函数 Test(int a) { print("a:%d", a); } Test(int a, int b) { print("a:%d b:%d", a, b); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,350
精华内容 33,740
关键字:

c++抽象类构造函数

c++ 订阅