你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

c++中的构造函数

[复制链接]
gaosmile 发布时间:2020-6-2 12:13
大家晚上好,今天给大家分享的是c++中的构造函数,这段时间可能分享c++、Uboot、linux内核的文章会比较多一点,自己的拖延症太强了,得改掉这个坏习惯来。每天进步一点点,日积月累你也是专家。
一、构造函数:
1、什么是构造函数?
关于这个构造函数,简单理解就是在一个类中,有一个函数,它的函数名称和类名同名,而且这个构造函数没有返回值类型的说法(  Test()这个函数就是构造函数了。):
#include <stdio.h>

class Test:
{
   public:
        Test()
        {
          printf("Test()\n");
        }
}

2、构造函数调用:
(1)一般情况下,构造函数在定义时自动被调用(主要作用就是自动去初始化类中的属性,这个属性通俗一点来说,就是我们所说的变量。而且这里的自动的意思,就是说当你创建了一个对象后,它就会自动调用构造函数,不用你再去main函数里面写构造函数了。):
#include <stdio.h>

class Test
{
public:
    Test()
    {
        printf("Test()\n");
    }
   
};

int main()
{
    Test t;      // 调用 Test()
    return 0;
}

演示结果如下:
root@txp-virtual-machine:/home/txp/c++# ./a.out
Test()

(2)一些特殊情况下,需要手工来调用构造函数(这个在下面带参数的构造函数里面会有一个案例分析)
二、带参数的构造函数:
(1)构造函数可以根据需要定义参数。
class Test
{
    public:
          Test(int v)
          {
         
          }
};

(2)一个类中可以存在多个重载的构造函数(什么重载函数,简单来说,可以同函数名,但是它的传参类型或者返回类型不同就是重载函数了。)下面来看一个具体带参构造函数案例:
#include <stdio.h>

class Test
{
private:
    int m_value;
public:
    Test()
    {
        printf("Test()\n");
        
        m_value = 0;
    }
    Test(int v)
    {
        printf("Test(int v), v = %d\n", v);
        
        m_value = v;
    }
    int getValue()
    {
        return m_value;
    }
};

int main()
{
    Test ta[3] = {Test(), Test(1), Test(2)};
   
    for(int i=0; i<3; i++)
    {
        printf("ta[%d].getValue() = %d\n", i , ta.getValue());
    }
   
    Test t = Test(100);
   
    printf("t.getValue() = %d\n", t.getValue());
   
    return 0;
}

演示结果如下:
root@txp-virtual-machine:/home/txp/c++# ./a.out
Test()
Test(int v), v = 1
Test(int v), v = 2
ta[0].getValue() = 0
ta[1].getValue() = 1
ta[2].getValue() = 2
Test(int v), v = 100
t.getValue() = 100

三、实战案例:
需求:开发一个数组类解决原生数组的安全性问题:

——提供函数获取数组长度

——提供函数获取数组元素

——提供函数设置数组元素

接下来我们先来写头文件IntArray.h,数组类就包含在里面:
#ifndef _INTARRAY_H_
#define _INTARRAY_H_

class IntArray
{
   private:
         int m_length;
         int* m_pointer;
   public:
         IntArray(int len);
         int length();
         bool get(int index, int& value);
         bool set(int index ,int value);
         void free();
};

#endif

然后接下来写IntArray.cpp,也就是类的方法具体实现了:
#include "IntArray.h"

IntArray::IntArray(int len)
{
    m_pointer = new int[len];
   
    for(int i=0; i<len; i++)
    {
        m_pointer = 0;
    }
   
    m_length = len;
}

int IntArray::length()
{
    return m_length;
}

bool IntArray::get(int index, int& value)
{
    bool ret = (0 <= index) && (index < length());
   
    if( ret )
    {
        value = m_pointer[index];
    }
   
    return ret;
}

bool IntArray::set(int index, int value)
{
    bool ret = (0 <= index) && (index < length());
   
    if( ret )
    {
        m_pointer[index] = value;
    }
   
    return ret;
}

void IntArray::free()
{
    delete[]m_pointer;
}

最后就在main中来创建对象,来实现所需功能:
#include <stdio.h>
#include "IntArray.h"

int main()
{
    IntArray a(5);
   
    for(int i=0; i<a.length(); i++)
    {
        a.set(i, i + 1);
    }
   
    for(int i=0; i<a.length(); i++)
    {
        int value = 0;
        
        if( a.get(i, value) )
        {
            printf("a[%d] = %d\n", i, value);
        }
    }
   
    a.free();
   
    return 0;
}

最终演示结果:
root@txp-virtual-machine:/home/txp/c++# ./a.out
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5

小结:
——构造函数可以根据需要定义参数

——构造函数之间可以存在重载关系

——构造函数遵循C++中重载函数的规则

——对象定义时会触发构造函数的调用

——在一些情况下可以手动调用构造函数

四、总结:
通过上面的学习,我们大概对构造函数的使用有了一个比较清楚的认识,不过要掌握的更加牢靠,还是通过更多的动手练习哦!。

收藏 评论1 发布时间:2020-6-2 12:13

举报

1个回答
likang1202 回答时间:2020-6-3 09:00:27
谢谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版