|
大家晚上好,今天给大家分享的是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.outTest() (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.outTest() 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.outa[0] = 1 a[1] = 2 a[2] = 3 a[3] = 4 a[4] = 5 小结: ——构造函数可以根据需要定义参数——构造函数之间可以存在重载关系 ——构造函数遵循C++中重载函数的规则 ——对象定义时会触发构造函数的调用 ——在一些情况下可以手动调用构造函数 四、总结: 通过上面的学习,我们大概对构造函数的使用有了一个比较清楚的认识,不过要掌握的更加牢靠,还是通过更多的动手练习哦!。 |
|
谢谢分享 |
微信公众号
手机版