C++ 构造函数总结

C++提供了构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,构造函数不需要用户来调用它,而是建立对象时自动执行。 构造函数的名字必须与类名相同,构造函数不具有任何类型,不返回任何值(与void类型不同,不是返回空,而是没有返回值)

1.无参数的构造函数

#include <iostream>
using namespace std;

class Time
{
public :
    Time()
    {
        hour = 0;
        minute = 0;
        sec = 0;
    }
    void showtime();
private:
    int hour;
    int minute;
    int sec;
};
void Time::showtime()
{
    cout<<"hour:"<<hour<<"min:"<<minute<<"sec:"<<sec<<endl;
}
 int main()
 {
 Time time;
 time.showtime();
 getchar();
 return 0; 
 }

由上述程序可以看到: 1.在类中定义了构造函数,函数的名字与类名时相同的,并利用这个构造函数对对象中的数据初始化。 2.那么程序在哪里调用了构造函数?在26行,实例化了一个类的对象,代码在执行26行时完成7-12行的内容。 3.构造函数除了可以定义在类内,还可以定义在类外,注意要先在类内声明,如下:

#include <iostream>
using namespace std;

class Time
{
public :
    Time();
    void showtime();
private:
    int hour;
    int minute;
    int sec;
};
void Time::showtime()
{
    cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
Time::Time()
{
    hour = 0;
    minute = 0;
    sec = 0;
}
 int main()
 {
 Time time;
 time.showtime();
 getchar();
 return 0;
 }

代码中第7行为声明,第18-23行为构造函数的定义。

运行结果: hour:0 minute:0 sec:0

2.带参数的构造函数

带参数的构造函数可以在实例化的时候传入不同的参数,让不同的对象具有不同的初值。

#include <iostream>
using namespace std;

class Time
{
public :
    Time(int,int,int);
    void showtime();
private:
    int hour;
    int minute;
    int sec;
};
void Time::showtime()
{
    cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
Time::Time(int h,int m,int s)
{
    hour = h;
    minute = m;
    sec = s;
}
 int main()
 {
 Time time(1,2,3);
 time.showtime();
 getchar();
 return 0;
 }

相比于上一个程序,只需要修改一部分就可以完成带参数的构造函数声明与定义:在7行的声明中带参数,在18-23行的定义中对类中的变量根据形参赋值,在26行的实例化中传入实参。

运行结果: hour:1 minute:2 sec:3

3.构造函数的重载

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

#include <iostream>
using namespace std;

class Time
{
public :
    Time();
    Time(int,int,int);
    void showtime();
private:
    int hour;
    int minute;
    int sec;
};
void Time::showtime()
{
    cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
Time::Time()
{
    hour = 0;
    minute = 0;
    sec = 0;
}
Time::Time(int h,int m,int s)
{
    hour = h;
    minute = m;
    sec = s;
}
 int main()
 {
 Time time1(1,2,3);
 time1.showtime();
 Time  time2;
 time2.showtime();
 getchar();
 return 0;
 }

以上代码只是将1,2组合,在8,9行声明了两个构造函数,它们的名字时相同的(就是类的名字,也没办法不相同啊,呵呵),在程序的19-24,25-30行定义函数。第33行代码调用带参数的构造函数,第35行调用无参数的构造函数,系统根据构造函数的参数的个数和类型确定调用哪个构造函数。

运行结果: hour:1 minute:2 sec:3 hour:0 minute:0 sec:0

构造函数的默认值

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

#include <iostream>
using namespace std;

class Time
{
public :
    Time(int h =2,int m=2,int s=2);
    void showtime();
private:
    int hour;
    int minute;
    int sec;
};
void Time::showtime()
{
    cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
Time::Time(int h,int m,int s)
{
    hour = h;
    minute = m;
    sec = s;
}
 int main()
 {
 Time time1(1,2,3);
 time1.showtime();
 getchar();
 return 0;
 }

第7行声明带参数的构造函数时给参数赋初值,在18-23行定义构造函数时根据实参赋值,如果没有指定形参对应的实参,系统将采用默认值。

Time time1(1,2,3);运行结果: hour:1 minute:2 sec:3

Time time1;运行结果: hour:2 minute:2 sec:2

Time time1(1);运行结果: hour:1 minute:2 sec:2

Time time1(3,3);运行结果: hour:3 minute:3 sec:2

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

洛谷P2759 奇怪的函数(log 二分)

491
来自专栏算法修养

POJ--3321 Apple Tree(树状数组+dfs(序列))

Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2...

3487
来自专栏数据结构与算法

洛谷U16574 attack的斐波那契

题目背景 attack很喜欢斐波那契数列 题目描述 设f[i]表示斐波那契数论的第i项 f[1]=1 ,f[2] =2 给定一个n 求 输入输出格式 输入...

2575
来自专栏King_3的技术专栏

leetcode-482-License Key Formatting

1233
来自专栏小樱的经验随笔

【Java学习笔记之二十五】初步认知Java内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类。   内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人对内部类也只是略知一二)。 第一次...

2935
来自专栏数据结构与算法

线性同余同余方程组解法(excrt)

【问题描述】 求关于 x 的同余方程组 x%a 1 =b 1  a1=b1 x%a 2 =b 2  a2=b2 x%a 3 =b 3  a3=b3 x%a...

4909
来自专栏杂七杂八

python中元素序列的频数

从一个随机序列中,找到出现次数最高的3个元素,它们出现次数是多少? 字典解决 from random import randint d = dict.fr...

3396
来自专栏Danny的专栏

Java内部类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

642
来自专栏小樱的经验随笔

统计0到n之间1的个数[数学,动态规划dp](经典,详解)

问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 例如:N=2时 1,2出现了1个 “1” 。 N=12时 1,2,3,4,5,6,...

3408
来自专栏数据结构与算法

洛谷P1501 [国家集训队]Tree II(LCT)

1470

扫码关注云+社区