zoukankan      html  css  js  c++  java
  • C++基础:缺省构造函数

            缺省构造函数,又称默认构造函数,是C++以及其他的一些面向对象的程序设计语言中,对象的不需要参数即可调用的构造函数。下面将针对缺省构造函数的定义、使用、以及注意问题等方面简要探讨。

            1、缺省构造函数是怎样的形式?是如何定义的?

             在C++的一个类中,如果构造函数没有参数,或者构造函数的所有参数都有默认值,就可以称其为缺省构造函数。一个类中,只能有一个缺省构造函数

    •  对于如下代码:构造函数MyClass()没有参数,就是MyClass的缺省(默认)构造函数。
    class MyClass
    {
    public:
    	MyClass(){
    		value = 1;
    		cout<<"无参默认构造函数调用并初始化value:"<<value<<endl;
    	};
    private:
    	int value;
    };

    •  而对于如下代码:构造函数Myclass(int  i = 10)的所有参数(此处只有一个参数i)都有默认值,这样的形式,也是MyClass的缺省(默认)构造函数。

    class MyClass
    {
    public:
    	MyClass(int i = 10){
    		value = i;
    		cout<<"参数都有默认值的默认构造函数调用并初始化value:"<<value<<endl;
    	};
    private:
    	int value;
    };

    • 要注意,一个类中只能有一个缺省构造函数。如果将以上的两个构造函数均加入类中,形如以下代码,就会有问题。
    class MyClass
    {
    public:
    	MyClass(){
    	value = 1;
    	cout<<"无参默认构造函数调用并初始化value:"<<value<<endl;
    	};
    	MyClass(int i = 10){
    		value = i;
    		cout<<"参数都有默认值的默认构造函数调用并初始化value:"<<value<<endl;
    	};
    private:
    	int value;
    };
    

           此时当建立MyClass mc这样的对象的时候,就会报错:


            2、缺省构造函数在何时被调用?

            缺省构造函数的调用主要包括如下的几种情况:

    • 对象被定义时无参数,形如:MyClass mc;
    • 动态分配对象时无参数列表,形如:MyClass *mcptr = new MyClass; 或 MyClass *mcptr = new MyClass();
    • 使用静态分配的数组,数组元素为某个类的对象,形如: MyClass mcArrayStatic[5];
    • 使用动态分配的数组,数组元素为某个类的对象,形如:MyClass *mcArrayDynamic = new MyClass[6];
    • 使用标准库的容器(如vector),容器的元素类型是某个类的对象,形如:vector<MyClass> vmc(7);
    • 在派生类的构造函数中未显示调用基类的构造函数,此时基类的缺省构造函数会被调用
            下面通过一段代码加以演示:
    #include<iostream>
    #include<vector>
    using namespace std;
    
    class MyClass
    {
    public:
    	MyClass(){
    	value = 1;
    	cout<<"无参默认构造函数调用并初始化value:"<<value<<endl;
    	};
    	/*MyClass(int i = 10){
    	value = i;
    	cout<<"参数都有默认值的默认构造函数调用并初始化value:"<<value<<endl;
    	};*/
    private:
    	int value;
    };
    
    class MyClassChild:public MyClass
    {
    public:
    	MyClassChild(){
    		cout<<"派生类构造函数调用"<<endl;
    	}
    };
    
    class MyClass2
    {
    public:
    	MyClass2(){
    		cout<<"Myclass2构造函数调用"<<endl;
    	}
    private:
    	MyClass myc;
    };
    
    //用于对缺省构造函数调用情况的演示测试,在main()函数直接调用即可
    void test_myclass()
    {
    	cout<<"对于默认构造函数调用的测试:"<<endl;
    	cout<<"
    未显示调用构造函数:"<<endl;
    	MyClass mc;
    	cout<<"
    显示调用构造函数:"<<endl;
    	MyClass *mcptr = new MyClass;
    	//或MyClass *mcptr = new MyClass();
    	cout<<"
    静态分配数组:"<<endl;
    	MyClass mcArrayStatic[5];
    	cout<<"
    动态分配数组:"<<endl;
    	MyClass *mcArrayDynamic = new MyClass[6];
    	cout<<"
    使用标准库容器:"<<endl;
    	vector<MyClass> vmc(7);//最大容量为7
    	cout<<"
    创建派生类:"<<endl;
    	MyClassChild mcc;
    	cout<<"
    包含别的类成员的类的创建:"<<endl;
    	MyClass2 mc2;
    }
            在main()函数调用test_myclass(),得到如下运行结果:


            3、注意事项:
            (1)对于你所创建的类(如此处的MyClass),如果没有为该类提供任何构造函数,那么编译器会自动生成一个默认的无参数的构造函数,但该函数体为空,不进行任何工作;然而,只要你为你的类定义了构造函数,无论是默认的构造函数形式,还是非默认构造函数的形式,哪怕只有一个,编译器都不会再生成默认的构造函数。
            举例言之,对于以上的类MyClass(),我去掉所有的构造函数,在运行下面的test_myclass(),依然可以运行,这是因为此时编译器为我的类生成了默认的构造函数,只是在其中未进行任何操作:
    class MyClass
    {
    
    private:
    	int value;
    };
            (2)在需要调用默认构造函数的情况下,如果并不存在默认构造函数,就会出错。
            比如,我定义了非默认构造函数形式的构造函数,此时编译器并不会帮我生成默认的构造函数,若运行test_myclass(),在需要调用默认构造函数的情况下,就会出错。
    class MyClass
    {
    public:
    	/*MyClass(){
    	value = 1;
    	cout<<"无参默认构造函数调用并初始化value:"<<value<<endl;
    	};*/
    	MyClass(int i ){//没有默认值,就不是默认构造函数
    	value = i;
    	cout<<"参数都有默认值的默认构造函数调用并初始化value:"<<value<<endl;
    	};
    private:
    	int value;
    };


            (3)并非所有的类都存在默认构造函数,前面已经说过,如果现实的定义了非默认构造函数,则编译器就不会自动生成默认构造函数,也就不存在默认构造函数,这是常见的错误,要注意。
            (4)如果某派生类的基类没有缺省构造函数,那么编译器也不会为该类隐式地定义缺省构造函数。因为该类即使隐式地定义缺省构造函数,也无法初始化其基类。
            (5)如果类的基类的缺省构造函数为私有,那么编译器会为该类隐式地定义缺省构造函数,但编译报错“cannot access private member declared in class 基类名字”。

  • 相关阅读:
    unitest 测试集 实例
    python3 设置滚动条
    python3 mail
    wordpress +window 走起~
    获取在线python 文档
    chrome 自动加载flash
    报错 hint: Updates were rejected because the remote contains work that you do 解决方法
    Bitcode
    Autorelease
    atomic
  • 原文地址:https://www.cnblogs.com/f8master/p/3826069.html
Copyright © 2011-2022 走看看