C++成长之路(9)——构造函数

本文深入解析构造函数的作用,包括初始化对象到特定状态、构造函数的形式、调用时机、默认构造函数及隐含生成的构造函数等内容。并通过实例展示了构造函数如何在类定义中实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造函数的作用

  1. 在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的初始状态。
  2. 例如:

希望在构造一个Clock类对象时,将初试时间设为0:0:0,就可以通过构造函数来设置。

构造函数的形式

  1. 函数名与类名相同;
  2. 不能定义返回值类型,也不能有return语句;
  3. 可以有形式参数,也可以没有形式参数;
  4. 可以是内联函数;
  5. 可以重载;
  6. 可以带默认参数值。

构造函数的调用时机

  1. 在对象创建时被自动调用
  2. 例如:

Clock myClock(0,0,0);

默认构造函数

1.调用时可以不需要实参的构造函数

参数表为空的构造函数

全部参数都有默认值的构造函数

2.下面两个都是默认构造函数,如在类中同时出现,将产生编译错误:

Clock();

Clock(int newH=0,int newM=0,int newS=0);

隐含生成的构造函数

如果程序中未定义构造函数,编译器将在需要时自动生成一个默认构造函数

  • 参数列表为空,不为数据成员设置初始值;
  • 如果类内定义了成员的初始值,则使用内类定义的初始值;
  • 如果没有定义类内的初始值,则以默认方式初始化;
  • 基本类型的数据默认初始化的值是不确定的。

“=default”

  1. 如果程序中已定义构造函数,默认情况下编译器就不再隐含生成默认构造函数。如果此时依然希望编译器隐含生成默认构造函数,可以使用“=default”。
  2. 例如

class Clock {

public:

   Clock() =default; //指示编译器提供默认构造函数

   Clock(int newH, int newM, int newS);     //构造函数

private:

   int hour, minute, second;

};


具体在程序中是这样实现的:

//类定义

class Clock {

public:

     Clock(int newH,int newM,int newS);//构造函数:与类同名

     void setTime(int newH, int newM, int newS);

     void showTime();

private:

     int hour, minute, second;

};

//构造函数的实现:

Clock::Clock(int newH,int newM,int newS): hour(newH),minute(newM),  second(newS) {

     }

//初始化列表:将形参值newH等赋值给类中对象的数据成员hour等。这样就省去初始化过程:hour = newH;等

//成员函数的实现:定义类中函数的功能
void Clock::setTime(int newH, int newM, int newS){//写上类名和作用域限定符
    hour = newH;
    minute = newM;
    second = newS;
}
void Clock::showTime(){
    cout << hour << ":" << minute << ":" << second;
}

 

int main() {

  Clock c(0,0,0); //自动调用构造函数

  c.showTime();

     return 0;

}

思考题:

如果将main函数中的Clock c(0,0,0);替换成Clock c;会有什么结果?

  • 编译运行正确,输出为0:0:0
  • 编译运行正确,输出为不确定的值
  • 编译报错
  • 运行出错

默认构造函数:

class Clock {

public:

       Clock(int newH, int newM, int newS); //构造函数

       Clock(); //默认构造函数

       void setTime(int newH, int newM, int newS);

       void showTime();

private:

       int hour, minute, second;

};

Clock::Clock(): hour(0),minute(0),second(0) { }//默认构造函数

//其它函数实现同前

 

int main() {

    Clock c1(0, 0, 0);       //调用有参数的构造函数

    Clock c2;         //调用无参数的构造函数

    c1.showTime();
    c2.showTime();

 ……

}

思考题:

#include<iostream>
#include<cstring>
using namespace std;

class Name
{

    char name[20];

public:

    Name()
    {
        strcpy(name,"");
        cout<<'?';
    }

    Name(char *fname)
    {
        strcpy(name, fname);
        cout<<'?';
    }

};

int main()
{

    Name names[3] = {Name("张三"),Name("李四")};

    return 0;

}

运行此程序输出符号?的个数是

  • 0
  • 1
  • 2
  • 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheeky_man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值