【转载】默认构造函数和构造函数重载

转载自:https://blog.csdn.net/simon_2011/article/details/78129898 

作者:simon_syeming 

本文主要总结了默认构造函数的相关用法和构造函数重载,旨在能够对平时的项目开发起到一定的夯实基本功的作用,言简意赅,一目了然。

首先需要了解构造函数是用来做什么?该类对象被创建时,编译器为对象分配内存空间,并自动调用该构造函数,由构造函数完成数据成员的初始化工作。

一、默认构造函数

  • 从代码层面进行分析
class testClass {
public :
    testClass();//不带参数的默认构造函数---------
    testClass(int a, char b);//构造函数
    testClass(int a = 0, char b = 'c');//参数都有默认值的默认构造函数-------

private:
    int m_a;
    char m_b;
};
  • 默认构造函数主要用来完成如下形式的初始化
testClass classA;
//或者
testClass *classA = new testClass;

在这种情况下,如果没有提供默认构造函数也就是以上两种默认构造函数其中的一种,编译器会报错。

  • 两种方式的默认构造函数 

1)、定义一个无参数的构造函数; 
             2)、定义所有参数都有默认值得构造函数。 
             注意:一个类只能有一个默认构造函数。也就是说上述两种方式定义的默认构造函数不能同时出现,一般选择testClass();              这种形式的默认构造函数。只有程序员定义了构造函数,编译器就不会再提供默认构造函数了。所以程序员最好再手动定              义一个默认构造函数,以防止出现testClass classA;这样的错误。 
             读者朋友可以试着修改静态成员变量和静态成员函数在C++类中的作用中的例子,试着创建Myclass类的对象,因为代码                 中定义了构造函数,所以编译器没有提供默认的构造函数,所以编译会报错,大家可以试着修改一下。

  • 举例说明——求盒子的容积
#include <iostream> 
using namespace std; 
class Box {   
public :   
    Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参数--默认构造函数
    int volume( );   
private :   
    int height;   
    int width;   
    int length; 
}; 
Box::Box(int h,int w,int len) 
{   
    height=h;   
    width=w;   
    length=len; 
}
//或者
//Box::Box(int h,int w,int len):height(h),width(w),length(len)
//{
//
//}

int Box::volume( )
{   
    return (height*width*length);
} 

int main( ) 
{  
    Box box1; //没有给实参   
    cout<<"The volume of box1 is "<<box1.volume( )<<endl;   

    Box box2(15); //只给定一个实参   
    cout<<"The volume of box2 is "<<box2.volume( )<<endl;   

    Box box3(15,30); //只给定2个实参   
    cout<<"The volume of box3 is "<<box3.volume( )<<endl; 

    Box box4(15,30,20); //给定3个实参  
    cout<<"The volume of box4 is "<<box4.volume( )<<endl;  
    return 0; 
}

可以看到,在构造函数中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。 它的好处是,即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。尤其在希望对每一个对象都有同样的初始化状况时用这种方法更为方便。

二、构造函数重载 
            在一个类中可以定义多个构造函数,以便提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。

#include <iostream> 
using namespace std; 
class Box {   
public : 
    Box(); //声明一个无参的构造函数   
    //Box(int h); //有1个参数的构造函数 
    //Box(int h,int w); //有两个参数的构造函数 
    Box(int h, int w, int len) :height(h), width(w), length(len);//声明一个有参的构造函数,用参数的初始化表对数据成员初始化
    int volume( );   
private :   
    int height;   
    int width;   
    int length; 
}; 
Box::Box() //定义一个无参的构造函数 
{   
    height=10; 
    width=10; 
    length=10; 
} 
//Box::Box(int h)
//{
//
//}
//
//Box::Box(int h,int w)
//{
//
//}

Box::Box(int h, int w, int len) :height(h), width(w), length(len)
{
}

int Box::volume( )
{   
    return (height*width*length); 
} 

int main( ) 
{   
    Box box1; //建立对象box1,不指定实参  
    cout<<"The volume of box1 is "<<box1.volume( )<<endl;   
    Box box4(15,30,25); //建立对象box4,指定3个实参   
    cout<<"The volume of box4 is "<<box4.volume( )<<endl;   
    return 0; 
} 

以上代码定义了四个重载构造函数,在建立对象时不指定参数,或者分别给定1个参数,2个参数和3个参数。

关于构造函数的重载的几点说明: 
1、调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor)。显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。 
2、尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。
--------------------- 
作者:simon_syeming 
来源:CSDN 
原文:https://blog.csdn.net/simon_2011/article/details/78129898 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/gaga961016/article/details/83588441