一、构造函数是干什么的



class Dog

{

public:

         // 类Dog的构造函数

         // 特点:以类名作为函数名,无返回类型

         Dog()

         {

               weight = 0;

         }

         

private:

      

         // 数据成员

         int weight;

}





       该类对象被创建时,编译系统对象分配内存空间,并自己主动调用该构造函数->由构造函数完毕成员的初始化工作



int main()

{

         Dogdd;

}

        编译系统为对象dd的每一个数据成员(weight)分配内存空间,并调用构造函数Dog( )自己主动地初始化对象dd的weight值设置为0



故:



        构造函数的作用:初始化对象的数据成员。





二、 构造函数的种类



class Dog 

{         



private :

        double    height;

        double    width;



public:



        //    无參数构造函数

        // 假设创建一个类你没有写不论什么构造函数,则系统会自己主动生成默认的无參构造函数,函数为空,什么都不做

        // 仅仅要你写了一个以下的某一种构造函数,系统就不会再自己主动生成这样一个默认的构造函数,假设希望有一个这种无參构造函数,则须要自己显示地写出来

        Dog(void)

        {

             height= 0.0;

             width=0.0;

        } 

        

        //    一般构造函数(也称重载构造函数)

        // 一般构造函数能够有各种參数形式,一个类能够有多个一般构造函数,前提是參数的个数或者类型不同(基于c++的重载函数原理)

        // 比如:你还能够写一个 Dog( int num)的构造函数出来

        // 创建对象时依据传入的參数不同调用不同的构造函数

        Dog(double a, double b)

        {

             height= a;

             width = b;         

         }

        

        //    复制构造函数(也称为拷贝构造函数)

        //    复制构造函数參数为类对象本身的引用,用于依据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中

        //    若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,详细原因请查询 有关 “浅拷贝” 、“深拷贝”的文章论述

        Dog(const Dog & c)

        {

                //将对象c中的数据成员值复制过来

               height = c.heightl;

               width    = c.width;

        }            

    

        // 类型转换构造函数,依据一个指定的类型的对象创建一个本类的对象

        // 比如:以下将依据一个double类型的对象创建了一个Dog对象

        Dog::Dog(double r)

        {

               height = r;

               width = 0.0;

        }



        // 等号运算符重载

        // 注意,这个类似复制构造函数,将=右边的本类对象的值复制给等号左边的对象,它不属于构造函数,等号左右两边的对象必须已经被创建

        // 若没有显示的写=运算符重载,则系统也会创建一个默认的=运算符重载,仅仅做一些主要的拷贝工作

        Dog &operator=( const Dog&rhs )

        {

                //首先检測等号右边的是否就是左边的对象本,若是本对象本身,则直接返回

                if ( this ==&rhs ) 

               {

                        return *this;

               }

                

                //复制等号右边的成员到左边的对象中

                this->height= rhs.height;

                this->width= rhs.width;

                

               //把等号左边的对象再次传出

               //目的是为了支持连等 eg:    a=b=c 系统首先执行 b=c

               //然后执行 a= ( b=c的返回值,这里应该是复制c值后的b对象)    

                return *this;

        }



};



以下使用上面定义的类对象来说明各个构造函数的使用方法:



void main()

{

        // 调用了无參构造函数,数据成员初值被赋为0.0

        Dog c1,c2;



        // 调用一般构造函数,数据成员初值被赋为指定值

        Dog c3(1.0,2.5);

        // 也能够使用以下的形式

        Dog c3 = Dog(1.0,2.5);

        

        //    把c3的数据成员的值赋值给c1

        //    因为c1已经事先被创建,故此处不会调用不论什么构造函数

        //    仅仅会调用 = 号运算符重载函数

        c1 = c3;

        

        //    调用类型转换构造函数

        //    系统首先调用类型转换构造函数,将5.2创建为一个本类的暂时对象,然后调用等号运算符重载,将该暂时对象赋值给c1

        c2 = 5.2;

        

       // 调用拷贝构造函数( 有以下两种调用方式) 

        Dog c5(c2);

        Dog c4 = c2;  // 注意和 = 运算符重载区分,这里等号左边的对象不是事先已经创建,故须要调用拷贝构造函数,參数为c2



        

        

}


【c++类的构造函数具体解释 】的更多相关文章

  1. C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)

    在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...

  2. [改善Java代码]使用匿名类的构造函数

    建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...

  3. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  4. scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  5. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  6. scala入门教程:scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

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

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

  8. C++-什么时候需要在类的构造函数中使用初始化列表

    1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...

  9. tuple解包给类的构造函数

    首先我们的第一步当然是将tuple解包.tuple提供了一个get函数来获取第N个元素.例如: get<1>(make_tuple(...)); 要将一个tuple全部拆解,就可以使用通过 ...

随机推荐

  1. Cocos2d-x 2.2.3 Android配置

    今天总结出来的部署流程,已经成功把自己的项目编译到android真机上.省去了安装ndk等步骤 环境: win7 64位 1.导入项目到eclipse 2.导入libcocos2dx 样例:C:\co ...

  2. 写的好帮手项目官员 - Evernote 5.4(Evernote的) 中国绿色版

    Evernote (中国名:Evernote的) 是一个自由和优秀的笔记软件或个人知识管理软件.它可以帮助你有效地管理所有类型的电子票据.信息等:xbeta 我写了很多信息化管理或 Evernote ...

  3. 【iOS发展-81】setNeedsDisplay刷新显卡,并CADisplayLink它用来模拟计时器效果

    (1)效果 (2)源码下载(假设提示没有小图片的话,自己找一个替换一下即可,看到效果即可) http://download.csdn.net/detail/wsb200514/8176339 (3)总 ...

  4. 安德鲁斯 建立与各种听众自己定义的ScrollView

    === 建立与各种听众自己定义的ScrollView === 尽管安卓5.1已经release, 可是ScrollView的封装和对外API依然少的可怜, 尽管它优化得非常好了. 所以问题来了: Sc ...

  5. Poj 3517 And Then There Was One Joseph核心问题

    基本上纯Joseph核心问题,只是第一步多一件.m. 然后你就可以用获得的递推公式: Win(n) 代表n当个人的中奖号码, 然后,Win(n)必须相等Win(n-1).当一个人将在下一次删除队列. ...

  6. 自定义View视图

    自定义View视图文件查找逻辑 之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写 ...

  7. oracle 数据库备份

    //创建临时表空间create temporary tablespace test_temp tempfile 'D:\oracle\data\test\test_temp.dbf' size 32m ...

  8. 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题

    今天在处理数据库过程中碰到这样的问题在插入一条数据到表中 系统报这样的错误 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题 表有一列是自增长的 ...

  9. elasticsearch的rest搜索---对于相关度的大牛的文档

    目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 五.对于相关度的大牛的文档 http: ...

  10. java_windows下修改eclipse的默认编码

    windows下修改eclipse的默认编码   windows下一般系统编码为 GB2312(中文版的windows), 由于我比较喜欢utf8格式的编码,现将修改方式和大家分享 如果要使新建立工程 ...