一、构造函数

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

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

(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. asp.net安装指令

    cd \ cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319aspnet_regiis.exe -i注册.NET4到IIS

  2. BaseSEOPage统一设置网站SEO

    代码: public class BaseSeoPage : System.Web.UI.Page { protected override void OnPreLoad(EventArgs e) { ...

  3. jetty tutorial

    http://www.eclipse.org/jetty/documentation/current/embedding-jetty.html#d0e18726 Version: 9.2.2-SNAP ...

  4. loadrunner--web_url函数用法

    web_url语法:        Int Web_url(const char *name, const char * url, <Lists of Attributes>, [EXTR ...

  5. python机器学习工具包scikit-learn

    scikit-learn这个非常强大的python机器学习工具包 http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.ht ...

  6. C语言中的nan和inf使用

    本文总结nan和inf在C语言当中的含义.产生和判定方法. C语言当中的nan 表示not a number,等同于 #IND:indeterminate (windows) 产生: 对浮点数进行了未 ...

  7. (一)JQuery动态加载js的三种方法

    Jquery动态加载js的三种方法如下: 第一种: $.getscript("test.js"); 例如: <script type="text/javascrip ...

  8. C#基础入门 十一

    C#基础入门 十一 复选框 复选框的应用--问卷调查 实现描述:通过问卷调查统计性别和下班后回家的方式,单击"提交"按钮,通过消息框显示所提交的信息.运行结果如下图所示(图27): ...

  9. 由于没有公钥,无法验证下列签名 Ubuntu

    问题:执行 apt-get update 时错误 W: GPG 错误:https://apt.dockerproject.org ubuntu-trusty InRelease: 由于没有公钥,无法验 ...

  10. CHARPTER 3--INDEX DMVs

    1.查找最重要的缺失的索引 --======================================================= --查找最重要的缺失的索引 ) DB_NAME() AS ...