|
大家晚上好,今天给大家分享的是c++中的构造函数,这段时间可能分享c++、Uboot、linux内核的文章会比较多一点,自己的拖延症太强了,得改掉这个坏习惯来。每天进步一点点,日积月累你也是专家。 一、构造函数: 1、什么是构造函数? 关于这个构造函数,简单理解就是在一个类中,有一个函数,它的函数名称和类名同名,而且这个构造函数没有返回值类型的说法( Test()这个函数就是构造函数了。): #include <stdio.h>& g2 \ u a% D! z3 f- L9 i: u class Test: {/ |/ q6 ^0 P6 ?8 [ public: Test()# @8 M" h- n: e# Z- [. Z# O5 K {- _+ i1 K) i% p& e( ?$ z Q printf("Test()\n"); }- M' V+ m4 h3 x) q/ c, K4 u } 2、构造函数调用: (1)一般情况下,构造函数在定义时自动被调用(主要作用就是自动去初始化类中的属性,这个属性通俗一点来说,就是我们所说的变量。而且这里的自动的意思,就是说当你创建了一个对象后,它就会自动调用构造函数,不用你再去main函数里面写构造函数了。): #include <stdio.h>6 w8 H) |, |# D5 p; M; G2 _- [( O" {+ v; m- \; b: N class Test2 O1 h- `& k0 R5 S, [ { public: Test() {( v- g! R5 @6 J9 y6 ?7 D: P0 S printf("Test()\n"); }" ]6 q e# h( W5 H };3 q. r5 K; e$ `8 |& {! @ O# q8 r; C/ y8 f O" z! o! h& C) N3 F9 m int main() {2 t% e0 m3 ]; Y, p. P1 { Test t; // 调用 Test() return 0;& r7 X6 `. H& I1 c } 9 m0 V; {* h0 }7 J; A* D+ r 演示结果如下: root@txp-virtual-machine:/home/txp/c++# ./a.out) S" M0 Q5 G: `Test()3 d+ }8 F% ?' R9 b (2)一些特殊情况下,需要手工来调用构造函数(这个在下面带参数的构造函数里面会有一个案例分析) 二、带参数的构造函数: (1)构造函数可以根据需要定义参数。 class Test) F' D; T, o; V( v1 a) z{$ A! |* A9 l$ s0 b" W public: ~( m$ V) x4 ~! A7 c5 M Test(int v) {, l* |% F: u7 F& U* c }) n- G7 T5 o; n6 L7 u: \( r };; V) ~0 q5 `, s- L 0 y" g; T4 ?0 Q" v7 G (2)一个类中可以存在多个重载的构造函数(什么重载函数,简单来说,可以同函数名,但是它的传参类型或者返回类型不同就是重载函数了。)下面来看一个具体带参构造函数案例: #include <stdio.h>) P: t% }1 Z& g4 @, `( P* p$ ?4 x" a: r/ j class Test { private:1 ?, f; ]" V8 c' u int m_value; public: Test() { printf("Test()\n"); ' s: V& X" t! ?* g# m' | m_value = 0; } Test(int v), n2 `1 [* o' T' n/ P7 b4 G8 X {6 w6 k) U' N& t1 V. \6 U printf("Test(int v), v = %d\n", v);, ^8 V/ r* J/ w$ D9 B % p6 s3 A$ H) ?9 c. a* b7 c m_value = v; } int getValue()( C* o; D) g G) f( G- n {. A: [& ]1 V2 t9 G# p A return m_value; } }; 5 r* t8 a' V3 ~7 B) O int main()$ H' r; L; D w7 D% o {7 E' D0 \' {+ V3 @% ^ Test ta[3] = {Test(), Test(1), Test(2)}; for(int i=0; i<3; i++) { printf("ta[%d].getValue() = %d\n", i , ta.getValue());+ N2 l4 F1 [4 W2 H+ ?8 g7 x) u } Test t = Test(100); printf("t.getValue() = %d\n", t.getValue());& x: [% f8 |* R 7 p/ N; M% j& I- S: ` return 0; } 演示结果如下: root@txp-virtual-machine:/home/txp/c++# ./a.outTest(): C& k, k5 o9 A p3 Z0 D( \ Test(int v), v = 1 Test(int v), v = 2 ta[0].getValue() = 0; y, t; w2 L# g1 e q& G3 V ta[1].getValue() = 1 ta[2].getValue() = 2" c' i' d5 g" } Test(int v), v = 100 t.getValue() = 100 : k7 x5 I! D+ n8 \6 N- B+ k0 k4 C 三、实战案例: 需求:开发一个数组类解决原生数组的安全性问题:" E0 u8 \& O" s ——提供函数获取数组长度7 Z7 I7 M+ e0 a q; h# C ——提供函数获取数组元素' a- I7 M* G2 m. n: d# \ ——提供函数设置数组元素# |4 V+ J- |, E) i4 x# ?8 g( _% T 接下来我们先来写头文件IntArray.h,数组类就包含在里面: #ifndef _INTARRAY_H_#define _INTARRAY_H_' ]. B! a$ f" H. _ u5 A' g2 n: [' t, g class IntArray {2 g/ ~1 V X; ` private: int m_length; int* m_pointer;. `: T7 s3 M2 O6 a public:' K2 Y7 a% M, n V IntArray(int len); int length();7 L/ u+ o0 d+ c! h bool get(int index, int& value); bool set(int index ,int value); void free();$ R5 R# B0 f- j' w! P; S! P8 N };& x& B# _4 ~# ] #endif. } p6 X1 d/ V* X7 N* t6 d 然后接下来写IntArray.cpp,也就是类的方法具体实现了: #include "IntArray.h"* [0 W- Q0 }* G IntArray::IntArray(int len)$ C R/ w5 {3 _: E {" @6 G+ a6 l: u/ N | m_pointer = new int[len]; for(int i=0; i<len; i++)6 _5 ~# \% J& C1 `; G6 d, A( \ { m_pointer = 0;5 D; x7 C% I9 G' V1 j } m_length = len;. ^! E; v0 h" _1 P% O7 C }, a2 S% E8 Z* ^* A + `0 l1 s% d3 X1 U9 e6 u int IntArray::length() { return m_length; } 7 N x; m. z8 s3 {6 r5 C- h5 n bool IntArray::get(int index, int& value)$ U9 v( y" @& |; q4 {0 m7 G; u: @ {4 T7 F0 n& Z" K) y( \ bool ret = (0 <= index) && (index < length());, L7 r7 w! p) e! V( N+ K % ?# o1 o; Z+ ]& [ if( ret )9 r0 o& r3 s( }9 F1 P" a { value = m_pointer[index]; } return ret; c! s7 l! e+ n# w8 D/ ^: ~4 W: m }, u. F) J1 t2 Z' Z- O bool IntArray::set(int index, int value) { bool ret = (0 <= index) && (index < length());1 E' t; ?9 ]# D5 ?: E5 ~( e- ^; ~ if( ret ): B& [- t2 D: @) n3 g { g( r1 v! R1 |2 k5 C# d0 z+ ~5 N' ~# d m_pointer[index] = value; @3 E( O% |9 Z } return ret;( @1 J5 D) a9 N' Z( `! N3 _ } 0 E v V7 T v; d6 G) Z void IntArray::free()# n# o9 z+ W/ p0 r { delete[]m_pointer; }9 ~" w: Q L! n- S) f Y1 W' Q 最后就在main中来创建对象,来实现所需功能: #include <stdio.h>. j+ O0 y( {2 A5 i#include "IntArray.h" 7 v) B( ]" W* i5 t& X* r; f2 \' q int main()9 W2 d3 K2 X/ ?' n0 T& N* B {6 `9 M+ f( b& X1 l" | IntArray a(5); for(int i=0; i<a.length(); i++)( \/ ]/ A: [% a {5 A# u. { { a.set(i, i + 1);. J6 t8 e, j4 _3 O } 1 p* V3 l) X% M& l for(int i=0; i<a.length(); i++)+ W; p l/ S' t4 b0 W4 |" ]' b" U: s {$ o$ p6 h3 M+ F5 \2 E' T4 o int value = 0; C/ m6 F( B& E3 P" I+ n % F' T+ F$ y4 X+ p if( a.get(i, value) ) {( ^3 L7 y% K- d. p, X& e3 e printf("a[%d] = %d\n", i, value); } }' h H2 B7 ^% v% X6 [( N a.free(); return 0; } C) J: F% W* S) @9 t ' l7 `3 ], B# B# Q4 p) o 最终演示结果: root@txp-virtual-machine:/home/txp/c++# ./a.outa[0] = 1 a[1] = 22 |9 @0 V/ |0 O/ [. y a[2] = 3 a[3] = 4 a[4] = 5* A* a9 \3 t! p( z* p 小结: ——构造函数可以根据需要定义参数! @ s: v8 J$ G' k! p ——构造函数之间可以存在重载关系 ——构造函数遵循C++中重载函数的规则$ l% ?0 i) K3 x ——对象定义时会触发构造函数的调用* X! c/ E& Q% r; O9 q/ D2 Y+ f u ——在一些情况下可以手动调用构造函数 / @- S0 `/ k6 c* Z1 @% s- O, C( z 四、总结: 通过上面的学习,我们大概对构造函数的使用有了一个比较清楚的认识,不过要掌握的更加牢靠,还是通过更多的动手练习哦!。 |
|
谢谢分享% m4 `. H0 m6 } Y5 q. E |
微信公众号
手机版