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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版