今天给同学写一个时间类,在缺省构造函数处出了error,查到这篇文章,感觉很有用。转过来和大家分享一下。
摘要:当只使用一部分缺省参数时,该缺省参数一定用于将构造函数参数表中最后一个或数个参数初始化。而代入的部分实参则用于将参数表中最初一个或数个参数初始化。当构造函数参数表中并不全部使用缺省参数时,具有缺省值的参数必须放置于参数表的最后。
转载自http://biancheng.dnbcw.info/c/336028.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] 利用对象指针数组为各对象动态地分配存储区并利用缺省参数将数组各单元初始化(动态分配存储区的另一种形式)
<span style="font-size:14px;">// 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;
}</span>
/* Results:CONS
CONS
CONS
CONS
50,20
50,20
50,20
50,20
*/
应该指出,只当须要进行初始化时,才为一个类定义其构造函数。并非每个类都要定义构造函数。事实上,以后有些例子中,有些类并无构造函数。
并不像有些书上所说,如果用户自己不定义构造函数,系统就为它定义一个缺省构造函数。事实上,VC++6.0版本中并不存在缺省构造函数。因此,首先,必须用户在类中定义了构造函数;然后,用户又要建立对象;只在同时满足这两个条件时,用户程序才调用其构造函数。否则,就不调用构造函数,因无构造函数可供调用。