`

《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版本中并不存在缺省构造函数。因此,首先,必须用户在类中定义了构造函数;然后,用户又要建立对象;只在同时满足这两个条件时,用户程序才调用其构造函数。否则,就不调用构造函数,因无构造函数可供调用。
分享到:
评论

相关推荐

    包含构造函数和析构函数的C++程序

    ### 构造函数和析构函数在C++中的应用 #### 概述 构造函数与析构函数是C++编程语言中非常重要的概念,它们在类的实例化和销毁过程中扮演着关键角色。通过理解这些函数的工作原理及其作用,我们可以更好地控制对象...

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

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

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

    ### C++面试试题详解:拷贝构造函数 #### 背景介绍 在C++编程中,拷贝构造函数是一个非常重要的概念,尤其对于那些处理复杂数据结构或资源管理的程序来说更是如此。拷贝构造函数是类的一种特殊成员函数,用于创建一...

    c++之十引用和拷贝构造函数

    在C++编程语言中,引用(Reference)和拷贝构造函数(Copy Constructor)是两个非常重要的概念,它们在处理对象的复制和传递时起到关键作用。这篇文章将详细探讨这两个主题。 首先,引用是C++中一种特殊的变量类型...

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

    JavaScript中的构造函数是用于创建特定类型对象的特殊函数。它们在对象实例化过程中起到了核心作用,使得我们可以定制对象的属性和方法。构造函数通常与`new`操作符一起使用,以便于初始化新创建的对象。 1. **构造...

    通讯录 c++ 构造函数 类

    在C++编程中,"通讯录 c++ 构造函数 类"这一主题涉及到对象导向编程中的核心概念,如类的设计、构造函数的使用以及数据成员和成员函数的管理。下面将详细解释这些知识点: 1. **类(Class)**: 类是C++中的一个...

    构造函数的继承问题 笔记

    3. **构造函数重载与父类构造函数的选择**:如果父类中有多个构造函数,子类可以通过`super()`后跟相应的参数列表来选择调用哪一个父类构造函数。 例如: ```java class Base { public Base() { System.out....

    在派生类的构造函数中调用基类的构造函数

    在C++中,有两种方式在派生类构造函数中调用基类构造函数: 1. 显式使用`base_class::constructor`语法: 派生类构造函数的初始化列表中可以直接指定基类的构造函数,如: ```cpp class Derived : public Base {...

    没有可用的复制构造函数或复制构造函数声明

    在C++编程中,"没有可用的复制构造函数或复制构造函数声明"是一个常见的错误,通常出现在尝试复制一个对象,而该对象的类没有定义复制构造函数时。在这个特定的情境中,问题出在一个名为`CArray, int&gt;`的自定义数组...

    工学四川大学C构造函数和析构函数PPT学习教案.pptx

    缺省构造函数(Default Constructor)是指没有参数的构造函数,当创建对象时没有提供初始化值时,会自动调用缺省构造函数。如果程序员没有定义,编译器会自动生成一个缺省构造函数,不执行任何操作。 析构函数...

    Javascript的构造函数和constructor属性

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

    类构造函数 the c++ programming language

    构造函数可以定义为默认构造函数(无参构造函数)或者带参数的构造函数。 ##### 默认构造函数 默认构造函数是指没有任何参数的构造函数。它可以用来创建一个默认状态的对象,如果没有显式定义,默认构造函数由...

    重写重载构造函数

    带参数的构造函数必须通过new语句或base语句来调用。例如: C#复制代码 public class Employee { public int salary; public Employee(int annualSalary) { salary = annualSalary; } public Employee(int ...

    C++拷贝构造函数的介绍及使用

    C++中的拷贝构造函数是编程中不可或缺的一个概念,它在处理对象的复制和赋值操作时起到关键作用。拷贝构造函数是一个特殊类型的构造函数,它的任务是创建一个新对象,这个新对象是已有对象的一个副本。这种功能在...

    构造函数继承.关于java

    // 调用BaseClass的带参数构造函数 System.out.println("Derived Class Constructor with int " + i); } public static void main(String[] args) { DerivedClass d = new DerivedClass(); DerivedClass t = ...

    构造函数Demo

    在C#编程语言中,构造函数(Constructor)是类的一个特殊方法,它的主要作用是在创建对象时初始化新实例。构造函数的名称必须与类名完全相同,并且没有返回类型,即使是void也不行。本篇文章将深入探讨C#中的构造...

    c++学习笔记

    默认构造函数不需要任何参数,而带参数的构造函数可以帮助我们在创建对象时设置初始值。析构函数(destructor)则在对象生命周期结束时自动调用,用于清理资源。此外,C++中的结构体(struct)与类(class)相似,但...

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

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

Global site tag (gtag.js) - Google Analytics