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

c++中的构造函数

[复制链接]
gaosmile 发布时间:2020-6-2 12:13
大家晚上好,今天给大家分享的是c++中的构造函数,这段时间可能分享c++、Uboot、linux内核的文章会比较多一点,自己的拖延症太强了,得改掉这个坏习惯来。每天进步一点点,日积月累你也是专家。
一、构造函数:
1、什么是构造函数?
关于这个构造函数,简单理解就是在一个类中,有一个函数,它的函数名称和类名同名,而且这个构造函数没有返回值类型的说法(  Test()这个函数就是构造函数了。):
#include <stdio.h>& g2 \  u  a% D
! z3 f- L9 i: u
class Test:
; |* S, `# o; G  d% Q# w7 y; W{/ |/ q6 ^0 P6 ?8 [
   public:
" w, _; f, s& J8 O" X! N        Test()# @8 M" h- n: e# Z- [. Z# O5 K
        {- _+ i1 K) i% p& e( ?$ z  Q
          printf("Test()\n");
: e4 F. P; l3 S        }- M' V+ m4 h3 x) q/ c, K4 u
}

+ P: `5 A6 x7 [+ r
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, [
{
9 y6 u. r7 D" `) Spublic:
% ?6 J" ?8 [  B; r1 K9 u    Test()
  N" c+ c4 }1 m( `# Q: l0 j    {( v- g! R5 @6 J9 y6 ?7 D: P0 S
        printf("Test()\n");
% i/ g8 S5 Z; F) B/ P2 w7 E    }" ]6 q  e# h( W5 H
   
! B9 a; B) X$ K  T4 g};3 q. r5 K; e$ `8 |& {! @
  O# q8 r; C/ y8 f  O" z! o! h& C) N3 F9 m
int main()
; M' ^  ^' B" q( @{2 t% e0 m3 ]; Y, p. P1 {
    Test t;      // 调用 Test()
! \) Q- E7 }* h    return 0;& r7 X6 `. H& I1 c
}
5 n9 A5 w4 Q* d' O$ T/ Y
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)
& \& g$ t4 C1 L+ A          {, l* |% F: u7 F& U* c
         
) X; }6 t& K/ A% t3 I          }) 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
) N$ K5 K1 k& I' ?7 Y{
* ]7 @) t: N% f% zprivate:1 ?, f; ]" V8 c' u
    int m_value;
: B" v+ p% m, [" R" P  H) o) spublic:
$ h2 m; p1 l* W0 `$ ]7 D    Test()
' |4 S/ }9 j. w    {
! h% g( @3 R, U7 h3 u# b1 V6 y        printf("Test()\n");
- N- \3 u; {; c0 v        ' s: V& X" t! ?* g# m' |
        m_value = 0;
5 w3 b5 Z' [) W- N+ @    }
1 {, z! E5 T$ \' I# r! F; O9 i    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;
) a8 b1 z9 k, c+ m4 Z    }
/ i& _% o1 y( L3 o/ y9 r( X( A    int getValue()( C* o; D) g  G) f( G- n
    {. A: [& ]1 V2 t9 G# p  A
        return m_value;
, l/ `. a2 l. l0 G6 ~; K    }
. N3 k3 X2 C2 {3 R' U9 Y: [};
( d; k# g) R0 N9 P0 T) a7 ~6 h* E  Q5 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)};
$ E8 d. U' ~7 p- J- ]0 P2 Q   
2 h8 L9 u$ X4 x! t, B2 X! i    for(int i=0; i<3; i++)
; [$ }; A  F0 \    {
" m+ v! Z& S8 T8 G( z/ V' P        printf("ta[%d].getValue() = %d\n", i , ta.getValue());+ N2 l4 F1 [4 W2 H+ ?8 g7 x) u
    }
; ^& ~1 n3 E' X0 G5 s+ I+ S) Z; I5 L   
; R, ~2 p4 D# L, M# D    Test t = Test(100);
! D" a1 n/ t/ v1 l   
9 F  Q) U0 r! S8 S3 T; V    printf("t.getValue() = %d\n", t.getValue());& x: [% f8 |* R
    7 p/ N; M% j& I- S: `
    return 0;
) u7 y0 l5 ~2 S* g, {}
; g0 w7 O1 N! F+ A8 |& `

/ ^  b5 L/ _6 W2 }$ m
演示结果如下:
root@txp-virtual-machine:/home/txp/c++# ./a.out
+ \9 a$ a6 U& g) {7 OTest(): C& k, k5 o9 A  p3 Z0 D( \
Test(int v), v = 1
: ~) i/ G9 m2 h* w/ D/ wTest(int v), v = 2
  _& n- j2 |/ }' P7 A6 s0 {ta[0].getValue() = 0; y, t; w2 L# g1 e  q& G3 V
ta[1].getValue() = 1
( W  }3 f6 Y3 d# Z$ e) Mta[2].getValue() = 2" c' i' d5 g" }
Test(int v), v = 100
; @$ {1 A5 M$ _7 F+ @' Gt.getValue() = 100
1 W* _& c* G! y$ ]* {+ q- D3 l
: k7 x5 I! D+ n8 \6 N- B+ k0 k4 C
三、实战案例:
需求:开发一个数组类解决原生数组的安全性问题:
+ m! r4 u& l3 _" E0 u8 \& O" s
——提供函数获取数组长度7 Z7 I7 M+ e0 a  q; h# C

5 `# a5 F3 f. A$ I, e——提供函数获取数组元素' a- I7 M* G2 m. n: d# \

4 Z: r* p. R& b# j' \/ R% Z1 v——提供函数设置数组元素
# |4 V+ J- |, E) i4 x# ?8 g( _% T
接下来我们先来写头文件IntArray.h,数组类就包含在里面:
#ifndef _INTARRAY_H_
: w, p( {: q$ K#define _INTARRAY_H_' ]. B! a$ f" H. _
  u5 A' g2 n: [' t, g
class IntArray
2 j; ~% X# S( n/ Q2 i{2 g/ ~1 V  X; `
   private:
$ K: i! K  Z5 g% I) V         int m_length;
7 T" v3 q) a0 c2 p9 k* v+ r         int* m_pointer;. `: T7 s3 M2 O6 a
   public:' K2 Y7 a% M, n  V
         IntArray(int len);
7 E" @5 E4 m. N- m         int length();7 L/ u+ o0 d+ c! h
         bool get(int index, int& value);
* z1 y7 _1 }5 }4 A6 ?( @0 K0 q         bool set(int index ,int value);
% \+ A0 Z4 i: m9 F, s         void free();$ R5 R# B0 f- j' w! P; S! P8 N
};& x& B# _4 ~# ]

7 T* P& [8 ~2 H4 Q% O7 P: b#endif. }  p6 X1 d/ V* X7 N* t6 d

) u, a7 l2 N4 z6 K
然后接下来写IntArray.cpp,也就是类的方法具体实现了:
#include "IntArray.h"
; F' `7 P  j, ~+ `3 L* M+ 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];
# q3 i7 Y4 |- C# i   
" J" d" J# d8 s% w: I$ E    for(int i=0; i<len; i++)6 _5 ~# \% J& C1 `; G6 d, A( \
    {
" a, m% d1 i  `, w: E        m_pointer = 0;5 D; x7 C% I9 G' V1 j
    }
4 \/ i! R5 w" |0 H   
( l* I7 K- I" s    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()
  u6 Y0 A( n5 t0 j{
& e# C$ j' E7 t) \6 n    return m_length;
) ]: p4 A' ~; ~}
( g1 Y7 _1 h, ?9 O& M! X2 p7 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
    {
" I% S4 H* b5 T, W+ Y/ h3 X        value = m_pointer[index];
4 s6 G# v& @2 C. a/ F6 X2 f% W    }
3 t* i, p. c) U/ U1 ?/ p1 J   
% @" a- u, r( p( A9 J( c  p4 }    return ret;  c! s7 l! e+ n# w8 D/ ^: ~4 W: m
}, u. F) J1 t2 Z' Z- O

, \  Z1 C, t3 I5 _& m# z( u5 [6 j0 G9 gbool IntArray::set(int index, int value)
" M+ Q: I0 ]  G! m{
) T1 @2 C. I7 u    bool ret = (0 <= index) && (index < length());1 E' t; ?9 ]# D5 ?: E5 ~( e- ^; ~
   
1 ?, [9 k/ t) m8 T    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
    }
' b0 Z. r: U( ^   
$ T, C$ y0 R6 r8 C0 Z+ c    return ret;( @1 J5 D) a9 N' Z( `! N3 _
}
. p9 F5 a, M( C( y0 E  v  V7 T  v; d6 G) Z
void IntArray::free()# n# o9 z+ W/ p0 r
{
; I1 l0 Q# L, u; v    delete[]m_pointer;
  o  y3 @3 g0 I2 \}
9 ~" w: Q  L! n- S) f  Y1 W' Q
最后就在main中来创建对象,来实现所需功能:
#include <stdio.h>. j+ O0 y( {2 A5 i
#include "IntArray.h"
7 G8 B- a* B- ?7 G1 r. z3 {0 `, U7 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);
5 a4 [5 n2 Q( V/ d) |   
, [6 V3 H/ [& x0 Z    for(int i=0; i<a.length(); i++)( \/ ]/ A: [% a  {5 A# u. {
    {
: N$ f4 T7 s8 q3 \( j8 y        a.set(i, i + 1);. J6 t8 e, j4 _3 O
    }
4 W' {0 q& |) e2 u    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) )
9 f* K2 N1 k! u& c# P, G        {( ^3 L7 y% K- d. p, X& e3 e
            printf("a[%d] = %d\n", i, value);
/ t5 ~0 }% C& o& I2 }, w* r        }
) g# N' j/ ]! f% n2 G; |9 |    }' h  H2 B7 ^% v% X6 [( N
   
; f7 S  V, z. Q/ s4 {+ ]    a.free();
* o- w. u# ?* S7 q) |+ E/ u9 T1 q# I# z   
: b1 \/ L6 w7 m3 d+ h    return 0;
3 `, Z) c; t( X/ Z4 ~/ I  |}  C) J: F% W* S) @9 t
' l7 `3 ], B# B# Q4 p) o
最终演示结果:
root@txp-virtual-machine:/home/txp/c++# ./a.out
. r: l: n; V4 ~/ f1 v8 fa[0] = 1
' t" x! |* o+ u1 ua[1] = 22 |9 @0 V/ |0 O/ [. y
a[2] = 3
; _" f4 M" l. s  o( Sa[3] = 4
1 m$ W6 Q' ~3 P+ O* Y1 b  |: u6 Va[4] = 5* A* a9 \3 t! p( z* p

  w- P* N" m  o* o9 r& |
小结:
——构造函数可以根据需要定义参数
8 {( j/ b) _% Q  d# Q. E! @  s: v8 J$ G' k! p
——构造函数之间可以存在重载关系
# X7 ~& U. n6 d6 W& P
2 ^1 B. d$ f  s) ]* O6 v1 X——构造函数遵循C++中重载函数的规则$ l% ?0 i) K3 x

+ c0 [# |# a) F9 i5 Y——对象定义时会触发构造函数的调用* X! c/ E& Q% r; O9 q/ D2 Y+ f  u

$ e5 T8 a6 d; ~" ?0 A* x! Y" |——在一些情况下可以手动调用构造函数
7 n2 s+ o) ~3 }$ I
/ @- S0 `/ k6 c* Z1 @% s- O, C( z
四、总结:
通过上面的学习,我们大概对构造函数的使用有了一个比较清楚的认识,不过要掌握的更加牢靠,还是通过更多的动手练习哦!。

. n9 L$ d: {1 H0 d
赞 收藏 评论1 发布时间:2020-6-2 12:13

举报

1个回答
李康1202 回答时间:2020-6-3 09:00:27
谢谢分享% m4 `. H0 m6 }  Y5 q. E

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版