|
大家晚上好,今天给大家分享的是c++中的构造函数,这段时间可能分享c++、Uboot、linux内核的文章会比较多一点,自己的拖延症太强了,得改掉这个坏习惯来。每天进步一点点,日积月累你也是专家。 一、构造函数: 1、什么是构造函数? 关于这个构造函数,简单理解就是在一个类中,有一个函数,它的函数名称和类名同名,而且这个构造函数没有返回值类型的说法( Test()这个函数就是构造函数了。): #include <stdio.h>3 u; u# D% P' C; r3 \+ U2 b class Test: { public:! [: O, i3 K; e/ l& H Test() { printf("Test()\n"); } } 2、构造函数调用: (1)一般情况下,构造函数在定义时自动被调用(主要作用就是自动去初始化类中的属性,这个属性通俗一点来说,就是我们所说的变量。而且这里的自动的意思,就是说当你创建了一个对象后,它就会自动调用构造函数,不用你再去main函数里面写构造函数了。): #include <stdio.h>4 j( u u: j3 M- f class Test { public:0 n4 G) Z$ L' o# b4 E+ f9 ^; } Test()7 M2 F: X; p6 `6 q; ~; M/ f1 C {7 j6 ?$ b3 P8 m. M. c6 L printf("Test()\n");+ g1 e! a5 K6 {: m; p3 G } C+ K, t ^2 { }; int main(), h; }, j. F. \8 N% j! F {* `0 e2 f, h) C( F: R- m8 w( Q' P Test t; // 调用 Test()' U; _4 b: I5 B5 C5 i2 f+ N* T5 N return 0; } 演示结果如下: root@txp-virtual-machine:/home/txp/c++# ./a.outTest()) ]) d0 \8 P8 w0 t (2)一些特殊情况下,需要手工来调用构造函数(这个在下面带参数的构造函数里面会有一个案例分析) 二、带参数的构造函数: (1)构造函数可以根据需要定义参数。 class Test{& Z( Z4 t* t' _/ ] public:+ l E5 l. ?$ v+ x F# L Test(int v)" w& J$ l0 k2 T7 i x {0 F. O/ L" g& { }- A' Z, }$ b7 S r6 l2 \- B8 \ };8 }5 N4 K' D. ?; x ; C: ?0 M. P( V6 ]- T6 ?0 o (2)一个类中可以存在多个重载的构造函数(什么重载函数,简单来说,可以同函数名,但是它的传参类型或者返回类型不同就是重载函数了。)下面来看一个具体带参构造函数案例: #include <stdio.h>class Test {( ?- r, Q7 \8 v7 p$ ^( V- F, D private: int m_value;0 y( m) K3 W: b; w$ y( [$ @' P public: Test() { printf("Test()\n");9 S+ |) o' q5 E, `! N1 u) e: a3 s " {+ k: R6 m6 y( Q {$ ?. M* L m_value = 0;4 G" `1 ^/ ]. |) p; L4 B) K" X) \9 o }& U1 n3 B5 G4 y( t' @4 M Test(int v)- w0 f& w$ [0 v) C: G {3 c; v6 ~% Y2 N6 M+ P printf("Test(int v), v = %d\n", v);6 C$ s1 p$ v$ } 7 L% h3 U& j% L) U! p9 ^1 y3 \ m_value = v; } int getValue()* u) k# o0 p; {6 E {1 C- I+ E) B/ Z! p5 N return m_value; } };- ~$ V+ a' b7 I" c+ @ int main() { Test ta[3] = {Test(), Test(1), Test(2)};2 Z( {2 P" r' Y* J% B for(int i=0; i<3; i++) {) x: r. Y9 i( _; i$ U printf("ta[%d].getValue() = %d\n", i , ta.getValue()); } 9 ]: ~% Q, Y g- j Test t = Test(100);/ X& H9 }1 C" ?! z! j* z% u s9 H printf("t.getValue() = %d\n", t.getValue());- h0 I8 Y& E/ e2 h* R. I 9 D% O0 q& _- o/ g Z return 0; } 7 C# |7 t5 p$ I4 T4 b 演示结果如下: root@txp-virtual-machine:/home/txp/c++# ./a.outTest()& G E6 [2 X) A! e- P Test(int v), v = 1 Test(int v), v = 2# c+ C* U9 `7 }8 v- F7 P7 o ta[0].getValue() = 0 ta[1].getValue() = 1 ta[2].getValue() = 2 Test(int v), v = 100 t.getValue() = 100 ; A5 ~4 y' \. ^4 X9 A; d K 三、实战案例: 需求:开发一个数组类解决原生数组的安全性问题:8 v( _; W% ?6 P+ ]% ~) E# L ——提供函数获取数组长度 ——提供函数获取数组元素 ——提供函数设置数组元素9 U* [4 J% |3 u 接下来我们先来写头文件IntArray.h,数组类就包含在里面: #ifndef _INTARRAY_H_/ Z$ R K# |# G$ Y) d* X' n9 v5 u#define _INTARRAY_H_ 9 E1 h# f( l. n/ a( b class IntArray. i! E! X$ j0 z/ d. C { private: int m_length;$ P3 ]4 @, l W( ] int* m_pointer; public:1 p% q5 A+ ^7 p" x2 F' A IntArray(int len);2 G! A8 _9 h! t) T& A- N2 [' u int length();6 j9 D% G, ^& c bool get(int index, int& value);' O" L M) O v4 ~% q0 [ bool set(int index ,int value); void free();; ?# _4 H' ]- F# M& s4 U( o }; * y# [+ Q6 P$ X8 R, B #endif 然后接下来写IntArray.cpp,也就是类的方法具体实现了: #include "IntArray.h"+ X7 d! i: ]3 a7 {2 p+ r0 d' b IntArray::IntArray(int len)$ z; k. Z! C6 d# n { m_pointer = new int[len];) X# D- X: ~# y & w1 Z" O9 o* g0 F8 Y for(int i=0; i<len; i++)/ L( c* m" Z! c) H) e { m_pointer = 0; } m_length = len;9 C& ~# \! d) q3 I+ ]& Z } int IntArray::length() {& X" F0 m, N0 }) ?! ?% _ return m_length;/ {2 ^1 ?( _% F% r% M } 1 B# Z8 B. b" w( q& l bool IntArray::get(int index, int& value)8 u) L' q& d3 {: ]( v( j( @$ ? { R% \+ {# h# v bool ret = (0 <= index) && (index < length()); , D' M: s# f' g if( ret ) { value = m_pointer[index]; }4 D* X% q# C' b8 `% k- }) h ; T. s; {0 a8 {4 z return ret;& M& ?; W! c+ p! S8 } }. U' k8 f1 A* e% e: s" s. _6 U d 2 d& P* X! U/ H* l3 l bool IntArray::set(int index, int value) {4 y4 O% p- K% V$ R" _# s bool ret = (0 <= index) && (index < length()); if( ret ) {5 X# L; |0 a/ y) ]1 b9 [3 o m_pointer[index] = value;) ~/ z/ b! R+ E& D) U0 l }( \5 J }# A6 a$ W: n2 _' p7 s; P return ret; }9 @' n$ t! @2 \% Y void IntArray::free()( F0 [- ?* V7 E { delete[]m_pointer; } 最后就在main中来创建对象,来实现所需功能: #include <stdio.h>! a @& {. Q( t3 o$ s0 n5 L#include "IntArray.h"9 ?9 Z' V' D) s9 G9 j8 H: S int main() { IntArray a(5); for(int i=0; i<a.length(); i++) {0 [) U @" n' |) | a.set(i, i + 1); } for(int i=0; i<a.length(); i++) {! m% ^# I% i2 n0 E- w int value = 0; if( a.get(i, value) ) {* q2 H# c% G' O7 Y printf("a[%d] = %d\n", i, value);- u8 C& p! l7 L% m- h }8 G# l3 k! d5 ^4 L9 v/ W } a.free(); return 0; }5 Q1 B. y7 @5 g5 w9 e j ' t' S, P/ m' Y0 l X 最终演示结果: root@txp-virtual-machine:/home/txp/c++# ./a.out5 \' k5 d+ D, m% B3 da[0] = 1 a[1] = 24 B) l. v0 [' s! n0 R t a[2] = 3) Y7 ^0 y2 Z. p a[3] = 4/ y3 p! m& G* o) n% U; _- J5 @ a[4] = 5 a9 @2 S: d4 m% Q; ~ 小结: ——构造函数可以根据需要定义参数 ~, w- V: u2 b6 q——构造函数之间可以存在重载关系. w2 g( ^8 D) B, A7 p ——构造函数遵循C++中重载函数的规则 / ]% a* [ q" @% O6 d ——对象定义时会触发构造函数的调用 ! K3 l$ \4 d7 o/ S ——在一些情况下可以手动调用构造函数 四、总结: 通过上面的学习,我们大概对构造函数的使用有了一个比较清楚的认识,不过要掌握的更加牢靠,还是通过更多的动手练习哦!。 ; ~% d t$ `8 I- f |
|
谢谢分享 |
微信公众号
手机版