`

《C++学习笔记》带缺省参数的构造函数(constructor with default arguments)

    博客分类:
  • C++
阅读更多
===============================================
未完待续,转载时请表明出处:http://www.cofftech.com/thread-1393-1-1.html
欢迎大家跟帖讨论哈~~~~~
===============================================
任何函数都可使用缺省参数,构造函数也不例外。
应该指出:对象的初始化不可能在类中实现而只能在建立对象时在每个对象中单独实现,以便通过各对象的非静态数据成员的不同数值来体现不同对象之间的差异性。
但个别时候希望使用相同参数将大部分对象初始化,例如人的体温可初始化为36.5摄氏度。此时可依靠带缺省参数的构造函数。
此外,当使用new将内存堆区空间分配给对象数组时,带缺省参数的构造函数可用于自动将对象数组中所有单元(也即数组内所有对象)初始化。
[例1]使用坐标缺省参数的构造函数
// default_1.cpp
// default parameters for constructors
#include <iostream.h>

class coordinates
{
int x, y;         //coordinates
public:
coordinates (int i=400, int j=300)          //正处于屏幕中央
              {     x = i;             y = j;             }
void show( )        {     cout<<x<<','<<y<<endl;   }
};

void main()
{
    coordinates  obj1;
    obj1.show( );
    coordinates  obj2( 200 );
    obj2.show( );
    coordinates  obj3( 650, 500 );
    obj3.show( );
}

/* Results:
400,300
200,300
650,500
*/
以上程序中class coordinates的构造函数具有两个缺省参数。主函数中建立了三个对象:其中obj1同时使用两个缺省参数将obj1的全部非静态数据成员初始化;obj2使用一个缺省参数将obj2的数据y初始化,而实参200则用于将数据x初始化;obj3不使用缺省参数,两个实参用于将全部非静态数据成员初始化。
可以看出,当只使用一部分缺省参数时(例如obj2),该缺省参数一定用于将构造函数参数表中最后一个或数个参数初始化。而代入的部分实参则用于将参数表中最初一个或数个参数初始化。
还须指出,当构造函数参数表中并不全部使用缺省参数时,具有缺省值的参数必须放置于参数表的最后。以下:
coordinates (int i, int j=100) 的参数表是对的;
coordinates (int i=100, int j) 的参数表是错的。

在建立单个对象时,可使用构造函数进行初始化。但在建立对象数组时,就无法使用构造函数进行个别单元的初始化操作。在一定情况下,可使用缺省参数将对象数组进行初始化。如下:
[例2]利用缺省参数为对象数组进行初始化
// default_2.cpp
// default parameters for constructors of object array
#include <iostream.h>

class point
{
    int x, y;         //point coordinates
public:
    point (int vx=50, int vy=100)
    {     x = vx;          y = vy;
                  cout<<"CONS"<<endl;           }
    void show( )               {     cout<<x<<','<<y<<endl;   }
};

void main()
{
    point  arr[4];
    for (int i=0; i<4; i++)         arr.show( );
}

/* Results:
CONS
CONS
CONS
CONS
50,100
50,100
50,100
50,100
*/
在以上程序中,主程序第一句建立了一个对象数组,该数组包含四个元素,每个元素就是一个对象。因此调用了四次构造函数。每一次该构造函数利用两个缺省参数将每个对象初始化。主函数第二句在四个循环中轮流显示四个对象中已被初始化的私有数据成员。
[例3] 利用对象指针数组为各对象动态地分配存储区并利用缺省参数将数组各单元初始化(动态分配存储区的另一种形式)
// default_3.cpp
// object pointer array used to create objects in heap
// default parameters for constructors of object created
#include <iostream.h>

class point
{
       int x, y;         //point coordinates
public:
       point (int vx=50, int vy=20)
       {     x = vx;          y = vy;
                     cout<<"CONS"<<endl;           }
       void show( )
              {     cout<<x<<','<<y<<endl;   }
};
void main()
{
       point  *ptr[4];           //指针数组
       for (int i=0; i<4; i++)         ptr=new point;
       for (i=0; i<4; i++)                     ptr->show( );
       for (i=0; i<4; i++)                     delete ptr;
}

/* Results:
CONS
CONS
CONS
CONS
50,20
50,20
50,20
50,20
*/
应该指出,只当须要进行初始化时,才为一个类定义其构造函数。并非每个类都要定义构造函数。事实上,以后有些例子中,有些类并无构造函数。
并不像有些书上所说,如果用户自己不定义构造函数,系统就为它定义一个缺省构造函数。事实上,VC++6.0版本中并不存在缺省构造函数。因此,首先,必须用户在类中定义了构造函数;然后,用户又要建立对象;只在同时满足这两个条件时,用户程序才调用其构造函数。否则,就不调用构造函数,因无构造函数可供调用。
分享到:
评论

相关推荐

    js核心基础之构造函数constructor用法实例分析

    本文实例讲述了js核心基础之构造函数constructor用法。分享给大家供大家参考,具体如下: 在js中,可以利用构造函数来创建特定类型的对象,其中,有一些原生的构造函数,Object、Array、等等,所以,当type of ...

    JavaScript精炼之构造函数 Constructor及Constructor属性详解

    对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)

    C++面试试题-拷贝构造函数

    这个试题是在面试过程中碰到过的一个考察C++ copy constructor这个知识点。

    Javascript的构造函数和constructor属性

    真正的原因是:一个对象的constructor是它的构造函数的prototype.constructor,而每一个函数都有一个prototype,默认情况下,这个prototype有一个constructor属性,指向的是它自己。 我觉得Javascript的设计本意是让...

    js构造函数constructor和原型prototype原理与用法实例分析

    主要介绍了js构造函数constructor和原型prototype原理与用法,结合实例形式分析js构造函数constructor和原型prototype基本原理、功能、使用方法及操作注意事项,需要的朋友可以参考下

    C++构造函数和析构函数的使用与讲解

    2.构造函数可以带参数,也可以重载 class Obj { ... public: Obj() { ... } Obj(int x, int y) { ... } }; 3.构造函数和普通成员函数不一样,一般不显示调用。在创建一个对象时,构造函数自动调用(编译器来...

    深入讲解C++中的构造函数

    C++构造函数 当创建一个对象时,往往需要做一些初始化工作,例如对数据成员赋值等。为了解决这个问题,C++提供了构造函数。 构造函数(Constructor)是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要...

    构造与析构顺序

    构造与析构在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。 初始化对象的...

    浅谈c++构造函数问题,初始化和赋值问题

    默认构造函数(就是没有参数的构造函数) The Default Constructor The default constructor is the constructor used to create an object when you don’t provide explicit initialization values. That is, it’...

    浅谈C++ Explicit Constructors(显式构造函数)

    此外,如果没有申明任何构造函数,编译器会为我们申明一个default构造函数。很像下面的Empty类: class Empty{ public: Empty(); Empty(const Empty &rhs); ~Empty(); Empty& operator=(const Empty &rhs); };...

    新手学习C++入门资料

    五、函数参数问题 (一) 无名的函数形参 声明函数时可以包含一个或多个用不到的形式参数。这种情况多出现在用一个通用的函数指针调用多个函数的场合,其中有些函数不需要函数指针声明中的所有参数。看下面的例子: ...

    php基础知识:类与对象(3) 构造函数和析构函数

    构造函数 PHP 5 允行开发者在一个类中定义一个方法作为构造函数。...使用新标准的构造函数 class BaseClass { function __construct() { print “In BaseClass constructor\n”; } } class SubCla

    Constructor:js构造函数

    Constructor:js构造函数

    JavaScript中构造函数与原型链之间的关系详解

    在Javascript中不存在class的概念,它的class概念是通过构造函数(constructor)与原型链(prototype)来实现。 1.构造函数(constructor):创建对象时的初始化对象,总是与new 关键是一同出现。 构造函数存在以下...

    不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象

    JavaScript中的对象模型(object model)并不广为人知,我们再设想:假设JavaScript没有构造函数或者没有new关键字会怎样?事情又会变成什么样的呢?让我们推到以前的重来,感兴趣的朋友可以详细了解下

Global site tag (gtag.js) - Google Analytics