构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void))。

默认构造函数:未提供显式初始值时,用来穿件对象的构造函数。

以上是二者的定义,但是单从定义很难对二者进行区别,下面依然看代码。

 class testClass
{
public:
testClass(); /* 默认构造函数 */
testClass(int a, char b); /* 构造函数 */
testClass(int a=,char b='c'); /* 默认构造函数 */ private:
int m_a;
char m_b;
};

上面的注释中已标出了默认构造函数和构造函数。下面,对二者的区别进行简单直白易懂的总结:

1. 默认构造函数主要是用来完成如下形式的初始化的:

 testClass classA;
// 或者 testClass *classA = new testClass;

在这种情况下,如果没有提供默认构造函数,编译器会报错;

非默认构造函数在调用时接受参数,如以下形式:

 testClass classA(,'H');
//或者 testClass *classA = new testClass(12,'H');

2. 如果程序猿没有定义任何构造函数,则编译器会自动定义默认构造函数,其形式如  testClass() {};   可以看出,编译器自动提供的默认构造函数是 啥也没有啊 ;

3. 定义默认构造函数有两种方式,如上述代码展示的,一是定义一个无参的构造函数,二是定义所有参数都有默认值的构造函数 ;

4. 注意:一个类只能有一个默认构造函数!也就是说上述两种方式不能同时出现,一般选择 testClass(); 这种形式的默认构造函数 ;

5. 只要程序猿定义了构造函数,编译器就不会再提供默认构造函数了,所以,程序猿最好再手动定义一个默认构造函数,以防出现 testClass a; 这样的错误。

举例:

#include <iostream>
using namespace std;
class Box {
public :
Box(int h=,int w=,int len=); //在声明构造函数时指定默认参数--默认构造函数
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(); //只给定一个实参
cout<<"The volume of box2 is "<<box2.volume( )<<endl; Box box3(,); //只给定2个实参
cout<<"The volume of box3 is "<<box3.volume( )<<endl; Box box4(,,); //给定3个实参
cout<<"The volume of box4 is "<<box4.volume( )<<endl;
return ;
}

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

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

 #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=;
width=;
length=;
}
//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(,,); //建立对象box4,指定3个实参
cout<<"The volume of box4 is "<<box4.volume( )<<endl;
return ;
}

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

关于构造函数的重载的几点说明: 
1、调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor)。显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。 
2、尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。

C++ 构造函数与默认构造函数的更多相关文章

  1. C++ 合成默认构造函数的真相

    对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数. 合成默认构造函数会初始化类中所有的数据成员. 第一个误解来自于我学习 ...

  2. Swift—默认构造函数-备

    结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函 ...

  3. C++中关于重载默认构造函数与默认全部参数的构造函数的使用注意

    # include<iostream>using namespace std;class Time{public:                            //公用成员函数  ...

  4. C++默认构造函数的问题

    C++ defaul construct :缺省构造函数(默认构造函数) 定义:第一种   构造函数没有参数,即是 A()形式的 第二种   构造函数的全部参数由缺省值提供,A(int a=0,int ...

  5. 【C++】默认构造函数

    参考文献: 1.黄邦勇帅 2.http://www.cnblogs.com/graphics/archive/2012/10/02/2710340.html 3.http://blog.csdn.ne ...

  6. 《从零开始学Swift》学习笔记(Day 37)——默认构造函数

    原创文章,欢迎转载.转载请注明:关东升的博客 结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部 ...

  7. [C++11] 默认构造函数

    类通过一个特殊的构造函数来控制默认初始化过程.这个函数就是默认构造函数.默认构造函数无需不论什么实參. 我们能够显示的定义默认构造函数也能够让编译器为我们生成默认构造函数. 默认构造函数以例如以下规则 ...

  8. <转载>构造函数与拷贝构造函数

    原文地址http://www.cnblogs.com/waynelu/archive/2012/07/01/2572264.html 构造函数 构造函数.析构函数与赋值函数是每个类最基本的函数. 对于 ...

  9. C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

    在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过: ...

随机推荐

  1. validate 不校验的解决办法

    最近使用validate.js用于项目的表单校验,调了半天,怎么都不校验,仔细对照例子发现 例子中要校验的文本框除了ID外还有name属性,而我在做的时候没有name属性,到这里终于 看到了希望,把所 ...

  2. 243. Shortest Word Distance 最短的单词index之差

    [抄题]: Given a list of words and two words word1 and word2, return the shortest distance between thes ...

  3. Free GIS Software

    Refer to There are lots of free gis software listed in the website: http://www.freegis.org/ http://w ...

  4. Python3 常用爬虫库的安装

    Python3 常用爬虫库的安装 1 简介 Windows下安装Python3常用的爬虫库:requests.selenium.beautifulsoup4.pyquery.pymysql.pymon ...

  5. IIS身份验证知识摘录

    IIS 身份验证 ASP.NET 身份验证分为两个步骤.首先,Internet 信息服务 (IIS) 对用户进行身份验证,并创建一个 Windows 令牌来表示该用户.IIS 通过查看 IIS 元数据 ...

  6. 如何杀死一个已经detached的screen会话?

    如果向杀死一个已经detached的screen会话,可以使用以下命令: screen -X -S seesion-id quit 举例如下: [root@localhost ~]# screen - ...

  7. delphi取括号内或括号外的内容

    function TSetParkForm.RemoveSgin(str: string): string; // 去掉括号内的内容(包括括号) var i1, i2, i: integer; beg ...

  8. [bash] 显示配色

    #/bin/bash for STYLE in 0 1 2 3 4 5 6 7; do for FG in 30 31 32 33 34 35 36 37; do for BG in 40 41 42 ...

  9. wp 取消button按下效果

    <Style x:Key="ButtonStyle2" TargetType="Button">            <Setter Pro ...

  10. Google Earth 8.0

    前几天有看到全新的Google Earth 8.0升级,刚好适合自己的手机应用.Google Earth 8.0 官方下载:https://play.google.com/store/apps/det ...