解析C++中构造函数的默认参数和构造函数的重载_C 语言

C++构造函数的默认参数

和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。

【例】

#include <iostream>
using namespace std;
class Box
{
  public :
  Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参数
  int volume( );
  private :
  int height;
  int width;
  int length;
};
Box::Box(int h,int w,int len) //在定义函数时可以不指定默认参数
{
  height=h;
  width=w;
  length=len;
}
int Box::volume( )
{
  return (height*width*length);
}
int main( )
{
  Box box1; //没有给实参
  cout<<"The volume of box1 is "<<box1.volume( )<<endl;
  Box box2(15); //只给定一个实参
  cout<<"The volume of box2 is "<<box2.volume( )<<endl;
  Box box3(15,30); //只给定2个实参
  cout<<"The volume of box3 is "<<box3.volume( )<<endl;
  Box box4(15,30,20); //给定3个实参
  cout<<"The volume of box4 is "<<box4.volume( )<<endl;
  return 0;
}

程序运行结果为:

The volume of box1 is 1000
The volume of box2 is 1500
The volume of box3 is 4500
The volume of box4 is 9000

程序中对构造函数的定义(第12-16行)也可以改写成参数初始化表的形式:

  Box::Box(int h,int w,int len):height(h),width(w),length(len){ }

可以看到,在构造函数中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。

它的好处是,即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。尤其在希望对每一个对象都有同样的初始化状况时用这种方法更为方便。

关于构造函数默认值的几点说明:
应该在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。
程序第5行在声明构造函数时,形参名可以省略。
如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。
在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。

C++构造函数的重载
在一个类中可以定义多个构造函数,以便提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。

通过下面的例子可以了解怎样应用构造函数的重载。

【例】定义两个构造函数,其中一个无参数,一个有参数。

#include <iostream>
using namespace std;
class Box
{
  public : Box( ); //声明一个无参的构造函数
  //声明一个有参的构造函数,用参数的初始化表对数据成员初始化
  Box(int h,int w,int len):height(h),width(w),length(len){ }
  int volume( );
  private :
  int height;
  int width;
  int length;
};
Box::Box( ) //定义一个无参的构造函数
{
  height=10; width=10; length=10;
}
int Box::volume( ){
  return (height*width*length);
}
int main( )
{
  Box box1; //建立对象box1,不指定实参
  cout<<"The volume of box1 is "<<box1.volume( )<<endl;
  Box box2(15,30,25); //建立对象box2,指定3个实参
  cout<<"The volume of box2 is "<<box2.volume( )<<endl;
  return 0;
}

在本程序中定义了两个重载的构造函数,其实还可以定义其他重载构造函数,其原型声明可以为:

  Box::Box(int h); //有1个参数的构造函数
  Box::Box(int h,int w); //有两个参数的构造函数

在建立对象时分别给定1个参数和2个参数。

关于构造函数的重载的几点说明:
调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor)。显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。
如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。
尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
构造函数
c 构造函数重载、构造方法可以重载吗、java构造函数重载、构造函数可以重载吗、构造函数重载,以便于您获取更多的相关知识。

时间: 2024-11-01 10:34:48

解析C++中构造函数的默认参数和构造函数的重载_C 语言的相关文章

解析C++中的虚拟函数及其静态类型和动态类型_C 语言

虚拟函数是C++语言引入的一个很重要的特性,它提供了"动态绑定"机制,正是这一机制使得继承的语义变得相对明晰. (1)基类抽象了通用的数据及操作,就数据而言,如果该数据成员在各派生类中都需要用到,那么就需要将其声明在基类中:就操作而言,如果该操作对各派生类都有意义,无论其语义是否会被修改或扩展,那么就需要将其声明在基类中. (2)有些操作,如果对于各个派生类而言,语义保持完全一致,而无需修改或扩展,那么这些操作声明为基类的非虚拟成员函数.各派生类在声明为基类的派生类时,默认继承了这些非

深入解析C++中的字符数组和处理字符串的方法_C 语言

C++字符数组 用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符.字符数组具有数组的共同属性.由于字符串应用广泛,C和C++专门为它提供了许多方便的用法和函数. 字符数组的定义和初始化 定义字符数组的方法与前面介绍的类似.例如: char c[10]; c[0]=′I′;c[1]=′ ′;c[2]=′a′;c[3]=′m′;c[4]=′ ′;c[5]=′h′;c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′; 上面定义了c为字符数组,包含10个元素.在赋值

深入解析C++中的指针数组与指向指针的指针_C 语言

指针数组定义:如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址. 形式:一维指针数组的定义形式为:int[类型名] *p[数组名] [4][数组长度];由于[ ]比*优先级高,因此p先与[4]结合,形成p[4]的数组的形式.然后与p前面的" * "结合," * "表示此数组是指针类型的,每个数组元素都相当于一个指针变量,都可以指向整形变量. 注意:不能写成int (*p)[4]的形式,这是指的

解析C++中四种强制类型转换的区别详解_C 语言

C++的四种强制类型转换,所以C++不是类型安全的.分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型.那为什么还需要一个新的C++类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换.C++中风格是static_cast<type>(content).C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干

解析wprintf 中使用%I64d格式化输出LONGLONG的详细介绍_C 语言

wprintf 中使用%I64d格式化输出LONGLONG 在写某个程序时,因为需要用到一个大的整数,就是要了LONGLONG型: 复制代码 代码如下: LONGLONG nLarge; 但是格式化时不知道应该用什么字符,用 %d,%l都不行.LONGLONGLONGLONG其实就是int64类型.在winnt.h可以看到: 复制代码 代码如下: typedef __int64 LONGLONG; 所以要想输出就要看__int64使用什么格式符了.通过查MSDN中,发现是:I64.在格式化输出则

解析c中stdout与stderr容易忽视的一些细节_C 语言

先看下面一个例子a.c : 复制代码 代码如下: int main(int argc, char *argv[]){ fprintf(stdout, "normal\n"); fprintf(stderr, "bad\n"); return 0;} $ ./anormalbad$ ./a > tmp 2>&1$ cat tmpbadtmp我们看到, 重定向到一个文件后, bad 到了 normal 的前面.原因如下: 复制代码 代码如下: &qu

C++语言基础 例程 带默认参数的构造函数

贺老师的教学链接  本课讲解 使用默认参数的构造函数 #include <iostream> using namespace std; class Time { public: Time( ); Time(int h,int m=0,int s=0); void show_time( ); private: int hour; int minute; int sec; }; Time::Time( ) { hour=0; minute=0; sec=0; } Time::Time(int h,

C++中函数的默认参数详细解析_C 语言

使用方法:(1)在函数声明或定义时,直接对参数赋值,该参数就是默认参数.(2)在函数调用时,省略部分或全部参数,这时就会使用默认参数进行代替. 注意事项:(1)一般在声明函数是设置默认参数. 如果在函数声明和定义函数时都设置了默认参数,则以函数声明的默认参数为准. 复制代码 代码如下: #include<iostream>using namespace std;int main(){ double add(double a=3.2,double b=9.6);//在函数声明时设置默认参数 co

c++中拷贝构造函数的参数类型必须是引用_C 语言

在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你"拷贝构造函数的参数为什么必须使用引用类型?"这个问题, 你会怎么回答? 或许你会回答为了减少一次内存拷贝? 很惭愧的是,我的第一感觉也是这么回答.不过还好,我思索一下以后,发现这个答案是不对的. 原因:如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传