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

c++中的构造函数

[复制链接]
gaosmile 发布时间:2020-6-2 12:13
大家晚上好,今天给大家分享的是c++中的构造函数,这段时间可能分享c++、Uboot、linux内核的文章会比较多一点,自己的拖延症太强了,得改掉这个坏习惯来。每天进步一点点,日积月累你也是专家。
一、构造函数:
1、什么是构造函数?
关于这个构造函数,简单理解就是在一个类中,有一个函数,它的函数名称和类名同名,而且这个构造函数没有返回值类型的说法(  Test()这个函数就是构造函数了。):
#include <stdio.h>
1 p# X0 ]8 W# W5 R3 u; u# D% P' C; r3 \+ U2 b
class Test:
( k7 o  w+ {: E# a7 h{
( `( V% E% G& w3 e2 Y4 o; ~8 w8 O7 v   public:! [: O, i3 K; e/ l& H
        Test()
" V5 l8 L- E9 a0 @; S+ ]; g: w        {
. `. m) M3 L+ n          printf("Test()\n");
; y8 F6 @) g- Y; ?) G# o" x3 N# k6 [( l        }
" |9 W0 k3 u/ g2 V. P}

, ^  f: j) P1 u  {0 v  h- T
2、构造函数调用:
(1)一般情况下,构造函数在定义时自动被调用(主要作用就是自动去初始化类中的属性,这个属性通俗一点来说,就是我们所说的变量。而且这里的自动的意思,就是说当你创建了一个对象后,它就会自动调用构造函数,不用你再去main函数里面写构造函数了。):
#include <stdio.h>
+ u: [* k2 ~" L7 k" _4 j( u  u: j3 M- f
class Test
/ F. }% H* i! M' M5 G1 b{
& f  d% _7 U+ v  {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
    }
9 \; J1 T7 c7 M, P' w      C+ K, t  ^2 {
};
3 |" z) t1 `) a
! n+ r$ [# d: y) x( hint 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;
' u" V/ @9 c% D9 n* h}
, N) `8 }1 M5 {5 x

+ G4 D# q; F/ r
演示结果如下:
root@txp-virtual-machine:/home/txp/c++# ./a.out
9 a2 x' W4 b( h# e( {, FTest()
) ]) d0 \8 P8 w0 t
(2)一些特殊情况下,需要手工来调用构造函数(这个在下面带参数的构造函数里面会有一个案例分析)
二、带参数的构造函数:
(1)构造函数可以根据需要定义参数。
class Test
; Z/ f, z* j. Y% e; H( \, R. C{& 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& {
         
8 C9 m6 q1 O, X  ]* `4 O( u+ a          }- 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>
8 B: r: q" s/ u4 {- t* \. p
8 T1 K% i5 x' p+ |class Test
; u3 b# v; M) x' I) r7 F1 U1 L! Q4 e{( ?- r, Q7 \8 v7 p$ ^( V- F, D
private:
0 E9 X9 g9 ~4 ?5 P* h    int m_value;0 y( m) K3 W: b; w$ y( [$ @' P
public:
% Q" R0 u6 Y' ], E    Test()
2 b' Z" l" L' }: l  D    {
6 E6 t0 c2 i' h* p8 _5 U& h( W        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;
% S7 |5 [: X0 @( y    }
* g! E$ n# v2 _; `$ S! v# g4 o' ?    int getValue()* u) k# o0 p; {6 E
    {1 C- I+ E) B/ Z! p5 N
        return m_value;
9 A% c  H% s# M- ~( p6 Z    }
7 \" P0 u! ]% `1 \( e};- ~$ V+ a' b7 I" c+ @

, L, n  b. U. h3 x4 e9 }/ Pint main()
4 q5 D3 n, r( {- E5 G! U0 ~& ^; W{
% X2 I2 C3 ~3 A  N4 H    Test ta[3] = {Test(), Test(1), Test(2)};2 Z( {2 P" r' Y* J% B
   
6 D1 A# w$ T6 X3 Z    for(int i=0; i<3; i++)
9 G+ p" |9 ]" b7 c$ s0 w    {) x: r. Y9 i( _; i$ U
        printf("ta[%d].getValue() = %d\n", i , ta.getValue());
2 S( {' B1 z  @    }
* I) B9 W8 ]: Z+ s2 u5 j    9 ]: ~% Q, Y  g- j
    Test t = Test(100);/ X& H9 }1 C" ?! z! j* z% u  s9 H
   
9 i; s% z; K. E, V    printf("t.getValue() = %d\n", t.getValue());- h0 I8 Y& E/ e2 h* R. I
    9 D% O0 q& _- o/ g  Z
    return 0;
* B1 b0 y' O% e9 Z2 \; A/ z/ z}
$ _( M; W$ Z3 s) Q& p/ S+ q
7 C# |7 t5 p$ I4 T4 b
演示结果如下:
root@txp-virtual-machine:/home/txp/c++# ./a.out
. T4 G5 w( D7 I# ~* @Test()& G  E6 [2 X) A! e- P
Test(int v), v = 1
' N: |! J; R* r$ X5 N/ \8 i- BTest(int v), v = 2# c+ C* U9 `7 }8 v- F7 P7 o
ta[0].getValue() = 0
, `* z+ t2 G, w8 R& Zta[1].getValue() = 1
% q* W# e& d6 L- N. R* Kta[2].getValue() = 2
" d& s3 Q; m! v' y# aTest(int v), v = 100
) h4 @$ k8 f3 bt.getValue() = 100
8 A: G: R; G" @+ P
; A5 ~4 y' \. ^4 X9 A; d  K
三、实战案例:
需求:开发一个数组类解决原生数组的安全性问题:
& J+ `& Y7 y* [/ v  A) y# c8 v( _; W% ?6 P+ ]% ~) E# L
——提供函数获取数组长度
) @" P" l7 m7 \9 b* E4 T- o
; F/ @/ c; O# O* x——提供函数获取数组元素
. k6 z3 h8 ]% d: P' @4 I
& E: Y2 b- Z' T. Z) b# R, r——提供函数设置数组元素
9 U* [4 J% |3 u
接下来我们先来写头文件IntArray.h,数组类就包含在里面:
#ifndef _INTARRAY_H_/ Z$ R  K# |# G$ Y) d* X' n9 v5 u
#define _INTARRAY_H_
$ Z: [& r( j. _; f# M- R3 p& X4 l4 K9 E1 h# f( l. n/ a( b
class IntArray. i! E! X$ j0 z/ d. C
{
6 h( h# A! F, Z6 }6 w   private:
  l0 T; _; k2 Y# ^         int m_length;$ P3 ]4 @, l  W( ]
         int* m_pointer;
, @0 s- O; V5 U. Z8 m   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);
' B# D' p  T" w+ ?+ J% b         void free();; ?# _4 H' ]- F# M& s4 U( o
};
% ?& [* [9 @, A2 m+ F+ s* y# [+ Q6 P$ X8 R, B
#endif
& @1 Q3 \5 t, ^) o! W

) _' ]/ Z, H. ^" v& A- m
然后接下来写IntArray.cpp,也就是类的方法具体实现了:
#include "IntArray.h"
# k8 ~. V7 P( |  z" \+ X7 d! i: ]3 a7 {2 p+ r0 d' b
IntArray::IntArray(int len)$ z; k. Z! C6 d# n
{
! T, L" b) b: E9 @8 _    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
    {
( y! `1 d9 R3 X0 c' ^' X        m_pointer = 0;
/ [2 l* z! T6 e- ]: @. P8 y    }
/ W* V8 W. a: J! W. T4 M" s6 W   
, C/ P- G# G  T+ J" c: Z    m_length = len;9 C& ~# \! d) q3 I+ ]& Z
}
6 U2 X* |) ~  U
  a: w3 F; P1 S% p$ }& kint IntArray::length()
, k5 r5 Z7 e' ~! ]+ X* C{& X" F0 m, N0 }) ?! ?% _
    return m_length;/ {2 ^1 ?( _% F% r% M
}
3 w5 u  j6 I( v1 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());
% B1 J  J/ V7 z2 c+ W5 V    , D' M: s# f' g
    if( ret )
7 D) r7 ?* T3 @1 x& B+ w    {
$ |9 T/ |3 j0 m% j& z+ t4 ?        value = m_pointer[index];
: V+ c4 t, c5 z! {    }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)
8 f% a* {; a( r4 A0 y5 L, J8 a{4 y4 O% p- K% V$ R" _# s
    bool ret = (0 <= index) && (index < length());
; b* f) r& V3 `, H   
1 x& Q+ O# b+ q) e  X, Q    if( ret )
! V0 q8 Z4 s" }6 A7 P    {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
   
1 S- D; g$ U/ T3 c    return ret;
1 \! ~% E) T& n. c+ h}9 @' n$ t! @2 \% Y

7 E7 u. X0 t$ |5 T7 c3 K3 m6 fvoid IntArray::free()( F0 [- ?* V7 E
{
/ `- q' k2 A) m/ O    delete[]m_pointer;
7 z  B% O4 Y3 C& f" K}

" }4 I" U" ?/ C  x- ~
最后就在main中来创建对象,来实现所需功能:
#include <stdio.h>! a  @& {. Q( t3 o$ s0 n5 L
#include "IntArray.h"9 ?9 Z' V' D) s9 G9 j8 H: S

; [& j6 _! h3 K* q+ w; [int main()
8 b8 q7 i; H4 R+ D{
/ H$ A- b) `7 _8 o    IntArray a(5);
8 H) q* K) b2 N9 k) I   
  o- s6 V" A& t- M  W8 F    for(int i=0; i<a.length(); i++)
1 y$ c1 v, _  d- A" A6 ]' X    {0 [) U  @" n' |) |
        a.set(i, i + 1);
- N" [) N' V3 {' p    }
5 Y: B7 O% l% j7 R' r$ X   
. a+ q( u: t8 ]' V+ l& A2 \    for(int i=0; i<a.length(); i++)
4 |2 k7 p% M4 _5 @$ ?    {! m% ^# I% i2 n0 E- w
        int value = 0;
% b5 j+ h$ {/ K% Z' Q+ ~. [        
3 d4 U- X" O# i- h- M        if( a.get(i, value) )
4 f2 O$ A' P' q3 C2 K  `( Z        {* 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
    }
, Q3 S1 [4 {$ ~: }* n  ]! }9 W3 X   
) a3 b6 ?7 q, T0 P6 x  {/ Q    a.free();
1 Q- h4 U8 x" @( y8 T   
: j, _2 m# F7 p" h. B' O    return 0;
. o" z& `4 `6 ^6 S# |$ o! k}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 d
a[0] = 1
5 {* r/ j  Z- G2 U# Y$ \3 h, Za[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
$ ^( Y. O9 L& P# g! E5 p6 A- Q
  a9 @2 S: d4 m% Q; ~
小结:
——构造函数可以根据需要定义参数  ~, w- V: u2 b6 q

3 l8 [. C( a) y( B- l- @$ C$ K/ v' y——构造函数之间可以存在重载关系. w2 g( ^8 D) B, A7 p

9 L# C" F* O5 l" y0 M——构造函数遵循C++中重载函数的规则
; W; K$ g8 p. T; H; h/ m. u% F; q/ ]% a* [  q" @% O6 d
——对象定义时会触发构造函数的调用
3 R( ]! U; B' Z9 ^! K3 l$ \4 d7 o/ S
——在一些情况下可以手动调用构造函数
+ X2 }4 \0 G' q8 w/ i

& D; }6 X) D& u  ]& z& Z, [" A- Q
四、总结:
通过上面的学习,我们大概对构造函数的使用有了一个比较清楚的认识,不过要掌握的更加牢靠,还是通过更多的动手练习哦!。
; ~% d  t$ `8 I- f
赞 收藏 评论1 发布时间:2020-6-2 12:13

举报

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