一、构造函数

在类中有一种特殊的成员函数,它的名字与类名相同,我们在创建类的时候,这个特殊的成员函数就会被系统调用。这个成员函数,就叫“构造函数”。

因为构造函数会被系统自动调动,构造函数的目的就是初始化类对象的数据成员。

(1)构造函数没有返回值,这是构造函数的特殊之处。

(2)不可以手工调用构造函数,否则编译会出错。

(3)正常情况下,构造函数应该被声明为public,因为创建一个对象时,系统要替我们调用构造函数,这说明构造函数是一个public的成员

类缺省的成员是私有成员,因此对于构造函数我们必须将其声明为public

class Time
{
private:
int Millsecond; // 毫秒
public:
int Hour; // 小时
int Minute; // 分钟
int Second; // 秒钟 void initTime(int tmpHour, int tmpMinute ,int tmpSecond)
{
Hour = tmpHour;
Minute = tmpMinute;
Second = tmpSecond;
} void initMillTime(int mls)
{
Millsecond = mls; // 成员函数可以访问成员变量,不管成员是否私有
} public:
// 构造函数
Time(int tmpHour, int tmpMinute ,int tmpSecond = )
{
Hour = tmpHour;
Minute = tmpMinute;
Second = tmpSecond;
initMillTime();
cout << “调用了构造函数” <<endl;
} Time() // 不加参数的构造函数
{
Hour = ;
Minute = ;
Second = ;
initMillTime();
cout <<”不加参数的构造函数” <<endl;
} // 单参数构造函数
Time(int tmpHour)
{
Hour = tmpHour;
Minute = ;
Second = ;
initMillTime();
cout << “调用了构造函数Time(int tmpHour)” <<endl;
}
} Time MyTime = Time(,,); // 创建类对象
Time MyTime1(,,); // 创建类对象

二、多个构造函数

一个类中可以有多种构造函数,就可以为类对象的创建提供多种初始化方法,但是多个构造函数需要有点不同的地方,比如参数数量或者参数类型。

对象拷贝

Time mytime2; // 可以调用无参数构造函数
// 下面四个对象并没有调用传统意义上的构造函数,他们调用的实际上是拷贝构造函数。
Time myTime22 = mytime2;
Time myTime23(mytime2);
Time myTime24{myTime2};
Time myTime25 = {myTime2};

三、函数默认参数

规定:

(1)默认值只能放在函数声明中,除非改函数没有函数声明。

(2)在具有多个参数的函数中指定默认值,默认参数必须出现在不默认参数的右边,一旦某个参数开始指定默认值,那么它右边的参数必须全部指定默认值。

Time mytime50 = Time(,); // 调用构造函数的时候,若有参数指定默认值,则可以不再参数列表中写。

四、隐式转换与explicit

Time mytime40 = ; // 42  // 调用了单参数的构造函数
Time mytime41 = (,,,,,); // 6 系统将数字转换为临时的Time对象
Time mytime100 = {}; // 正常写法,带一个参数16可以让系统明确的知道调用那个构造函数。
Time mytime101 = ; // 含糊不清的写法,存在临时对象隐式转换的问题
//是否可以强制系统,明确要求构造函数不能做隐式类型转换?
//可以,如果构造函数声明中带有explicit,则这个构造函数只用于初始化和显式类型转换;
// 构造函数前面加explicit
explicit Time(int Hour,int Minute,int Second);
Time myTime = Time(,,);
Time myTime(,,);
Time myTime = Time{,,};
Time myTime{,,};
//Time myTime = {12,13,14); // 做了隐式类型转换,出问题,复制列表初始化
//对于单参数的构造函数,一般都声明为explicit,除非你有特殊的理由。
//不允许直接调用构造函数。

五、构造函数初始化列表

Time::Time(int tmpHour,int tmpMinute,int tmpSecond):Hour(tmpHour),Minute(tmpMinute),Second(tmpSecond)
{ }

构造函数详解,explicit,初始化列表的更多相关文章

  1. C++构造函数详解及显式调用构造函数

    来源:http://www.cnblogs.com/xkfz007/archive/2012/05/11/2496447.html       c++类的构造函数详解                  ...

  2. C++中构造函数详解及显式调用构造函数

    C++构造函数详解及显式调用构造函数                                         c++类的构造函数详解                        一. 构造函 ...

  3. [转]c++类的构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

  4. c++构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

  5. c++类的构造函数详解

    c++类的构造函数详解 一. 构造函数是干什么的 class Counter{ public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类 ...

  6. C++构造函数详解(复制构造函数)

    构造函数是干什么的 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员. 构造函数的种类 class Compl ...

  7. c++构造函数详解(转)

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

  8. 转 C++拷贝构造函数详解

    C++拷贝构造函数详解 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一 ...

  9. 08--C++拷贝构造函数详解

    C++拷贝构造函数详解 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plain copy int a = 100; int b ...

  10. 07--c++类的构造函数详解

    c++类的构造函数详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特 ...

随机推荐

  1. UNITY_INITIALIZE_OUTPUT宏

    UNITY_INITIALIZE_OUTPUT宏 UNITY_INITIALIZE_OUTPUT(type,name) –此宏用于将给定类型的名称变量初始化为零.在使用旧版标准所写的Shader时,经 ...

  2. Django基础模板案例

    想要用django  访问一个页面 同时传参数过去.在页面中接受参数 案例:附代码 #创建一个项目 项目名字是 yhl_test django-admin startproject yhl_test ...

  3. How to use Qt Designed Ui file

    Ui Designed file In Working, we can use Qt Designer to designe UI; Then, use uic -o head.h designe.u ...

  4. Shared Libraries with Eclipse on 86_64 (64 bits) systems[z]

    If you followed my previous post http://linuxtortures.blogspot.com/2012/02/shared-libraries-with-ecl ...

  5. Linux gcj命令

    一.简介 GCJ是GNU的Java编译器,可以把java程序编译成本地代码,编译成功后的可执行文件不再需要jre就可直接运行,编译成本地后的程序运行速度有所提高,缺点是生成后的文件较大. 参考: ht ...

  6. rsync同步常用命令[转载]

    转载:http://blog.csdn.net/niushuai666/article/details/16880061 如果你是一位运维工程师,你很可能会面对几十台.几百台甚至上千台服务器,除了批量 ...

  7. [Selenium]计算坐标进行拖拽,重写dragAndDropOffset

    //@author jzhang6 public void dragAndDropOffset(WebDriver driver,WebElement dragableEl, WebElement d ...

  8. php利用mpdf生成pdf并保存到目录

    下载mpdf7.0两种方法 (1). github地址:https://github.com/mpdf/mpdf (2). composer require mpdf/mpdf <?php er ...

  9. Vivado 2017封装自定义IP Core

    使用Vivado2017.3自定义IP Core.通常情况下,我们做设计采用模块化设计,对于已经设计好的一部分模块功能,就可以直接拿来调用,IP Core就是这样来的,一般来说我们看不到IP Core ...

  10. shell 脚本 查看班上同学的网络状态

    #!/bin/base # a=192.168.100. //定义变量 c=('王浩' '谢云生' '黄科杨' '何星宇' '张宸兵' '胡燕' '刘桃') //定义数组 for b in {101. ...