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

TouchGFX界面开发应该知道的 C++基础(1)

[复制链接]
hfndhf123 发布时间:2023-9-25 09:44
TouchGFX是一个基于STM32硬件,由C++写成的软件框架,所以有必要对C++基础有一定的了解
一. C++新特性

9 }. `0 T* ]" W" _4 v
C语言里,变量初始化必须在程序的前面,而C++则可以随用随定义。C++也可以直接初始化,比如 int x(100),这样就直接赋值 x=100C++的输入输出方式:以cin和cout代替了C语言里的scanf和printf
cout语法形式:
  1. cout << x << endl;
    6 P! P  E* T* i% r: D
  2. // x 可以是任意数据类型(或表达式)
    . x: n6 ~8 m) |4 X9 o. ?
  3. // endl 是换行符,与C里的"\n"效果一样6 X/ _* a  c6 J) n0 n( y
  4. cout << x << y << endl;  //多个变量的输出
复制代码
cin 语法形式:
  1. cin >> x;  //x可以是任意数据类型' J+ K/ \2 J+ d5 y3 g! _1 n8 J
  2. cin >> x >> y; //多个变量的输入
复制代码

C++的命名空间 namespace:using namespace std;

  1. #include <iostream>( M2 T" C3 j, p% \/ P. C7 x9 K
  2. using namespace std;
    ! s; m2 Q! l6 X  f
  3. int main(){$ Y1 z+ S9 o' c
  4. cout << "Hello, World!" << endl;
    - S* d  r& M9 z0 c+ Q/ ~7 x
  5. return 0;
    7 S$ M1 _: M4 i: L9 e9 t1 x, g: O( I; |3 }
  6. }
复制代码
上面程序中,头文件要写成iostream,因为是标准输入输出流;带".h"的是非标准输入输出流。using是编译指令,声明当前命名空间的关键词,可理解成使用命名空间std,因为cin和cout都是属于std命名空间的,所以使用时须加上using namespace std,也可以写成std::cin和std::cout,其中 :: 表示作用域
) [5 Z- A( G3 |( d* n! O4 W% @: y9 Y
为什么要使用命名空间呢?一些名字易冲突,所以会使用命名空间的方式进行区分,具体来说就是加个前缀。比如C++标准库里面定义了vector容器,自己又写了个vector类,这时名字就冲突了。于是使用标准库里的名字时,都要加上std::的前缀,即std::vector来引用。经常写全名比较繁琐,所以在名字没有冲突的情况下可以添加using namespace std,那么接下去使用标准库里的名字时就可以不用再写std::前缀了
  1. /***** namespace_example.cpp *****/
    5 h  i+ \' i) l. `  K4 F# d. G
  2. #include <iostream>/ z, \" x8 F# H! z* u9 k4 `
  3. using namespace std;
      l6 Q; m% F& t0 ]% h3 p( b
  4. namespace A { //自定义命名空间A% w" O' E& C  t2 ]5 X8 v
  5. int x = 1;
    ) H( z$ G6 {. R# D$ t! q: q
  6. void fun() {
    - ?8 a" w; ~' H/ w( X  L% S. G
  7.   cout<<"A namespace"<<endl;
    # A( b' M5 }6 A: z
  8. }/ a/ T* s+ `* U; Y6 J; J* t; g
  9. }. E- W; T3 z+ P8 x
  10. using namespace A; //声明使用命名空间A
    $ G, b3 c! a" q$ H, ]& U1 c/ _
  11. int main(){
      s# o# J" v8 W$ Q: A
  12. fun(); //声明使用命名空间A后,可直接使用fun()
    / a/ y' R) B* l! G% F
  13. A::x = 3; //将A命名空间下的x重新赋值为3
    & Q# V4 X5 p' e, A, Z  _5 y
  14. cout<<A::x<<endl;# s) w. t0 D$ F$ h
  15. A::fun();5 W4 D% n5 T! J! \- f9 u) U0 l
  16. return 0;' i. a; r4 a) D) l) E) E0 C
  17. }
复制代码
执行下面的指令开始编译
  1. g++ namespace_example.cpp -o namespace_example
复制代码
执行./namespace_example后结果如下
  1. A namespace
      X% N7 ]8 U; y" @* K$ ]
  2. 3, o! |; a; Z8 I8 T
  3. Anamespace
复制代码
二. C++面向对象
5 B8 G( c. k! c( O/ [
面向对象的三大特征是继承,多态和封装
2.1 类和对象
类是C++的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员,函数在一个类中被称为类的成员。从类中实例化对象分两种方法,一种是从栈中实例化对象,一种是从堆中实例化对象
0 n$ f7 x. B. E; F
  1. /***** class_dog_example.cpp *****/
    & i: Y2 D4 ?7 F  o! {6 f( G8 E+ y
  2. #include <iostream>  G- _* q! S* y; C- P# z
  3. #include <string>2 K6 R. y/ ^( k  \# n! @; r0 }
  4. using namespace std;
    1 }) M1 T1 ?( D3 p' l6 D5 a4 ]
  5. ' A  M( x4 u# M3 x( R2 g
  6. class Dog {  //定义一个类0 j; S/ V) R; ~, R! I
  7. public:   //访问限定符public(公有的),不写的话默认是private1 L$ _2 u2 D! o* t2 ?! [) E- T
  8. string name;' D; q! P* d4 |2 s, T" s4 A! b9 s
  9. int age;
    # R( f) n- G2 e

  10. ! d8 }9 t+ {. v% p4 M
  11. void run() { //定义一个方法* [! C+ D: ~' b, A' \9 L1 y  Q4 Y
  12.   cout<<"小狗的名字是:"<<name<<","<<"年龄是"<<age<<endl;6 u5 s1 @$ e& H# y  ]8 Z# I! C5 J* \
  13. }
    . i" ]4 F3 q; r9 k1 ]  J2 c
  14. };1 {; W6 `4 Y0 i

  15. 7 D/ u% P9 ^" m( ~4 R9 x+ ~6 S
  16. int main() {: W% T2 e7 a8 S: R
  17. /* 从栈中实例化一个对象dog1 */
    % Q& `# E; a) a( n: Q& \
  18. Dog dog1;
      o$ I; @. L8 x" v$ E  \
  19. dog1.name = "旺财"; //为dog1的成员变量赋值
    ! ^/ J. E! W; }1 m4 P! ^2 d; z
  20. dog1.age = 2;  //为dog1的成员变量赋值/ S" c5 O0 c8 A# G
  21. dog1.run();   //调用run()方法,打印dog1的相关变量信息5 B: n6 T- H& z! o4 Z
  22. /* 从堆中实例化对象,使用关键字new的都是从堆中实例化对象 */$ X: @* e. W7 N7 g, @* B  A
  23. Dog *dog2 = new Dog();
    , B7 r8 F; S6 b7 F7 K6 `# M4 t
  24. if (NULL == dog2) { //从堆中实例化对象需要开辟内存,指针会指向那个内存
    ; C% r: d& s! r" _
  25.   return 0;3 O  X) N& ~" [/ Y' I; _
  26. }
    - ~) s0 F% N. U
  27. dog2->name = "富贵"; //为dog2的成员变量赋值
      D' k, q% {& N4 [0 h
  28. dog2->age = 1;   //为dog2的成员变量赋值0 d) R' j+ }1 P% Z( W- q
  29. dog2->run();   //调用run()方法,打印dog2的相关变量信息
    / V. z9 C8 J+ T; L
  30. 6 G+ D& `# F& D
  31. delete dog2;   //释放内存: o) g. Z% \4 K  Y
  32. dog2 = NULL;   //将dog2重新指向NULL0 U" x2 k1 p" x( S% N% e
  33. return 0;
    2 X" S) \7 C2 w( U$ \% }
  34. }
    / I2 P1 L; M- x- N
  35. 执行下面的指令开始编译* [$ Q5 W8 o3 q! I+ f- ~9 P

  36. ) b3 _  ]2 f! b9 c: t3 E
  37. g++ class_dog_example.cpp -o class_dog_example7 L% h; |& S$ R  J$ G0 d% [) j# B
  38. 执行./class_dog_example后结果如下
    " v" C& M  r/ C5 k

  39. ; l  ^2 O+ \2 C2 Z' k, E4 {' W
  40. 小狗的名字是:旺财,年龄是29 f' g! i  Z& t6 e8 Z3 ]
  41. 小狗的名字是:富贵,年龄是19 F4 ]# b. |6 U
  42. ⏩ 构造函数与析构函数5 R. b, F; w0 l# s
  43. 构造函数在对象实例化时被系统自动调用,仅且调用一次。构造函数的特点如下:
    9 M# c* H# w( u$ [0 [, `
  44. 构造函数必须与类名同名4 P( p4 _  y3 ]4 [& c; e0 J# t
  45. % W$ z0 V7 d* _7 F; u3 R2 {
  46. 可以重载,没有返回类型$ e: G3 ]; r8 @4 P$ t

  47. 6 }0 ]) r- P3 b+ z3 u3 K* H- ^9 o
  48. 构函数在对象结束其生命周期时系统自动执行。析构函数的特点如下:$ J+ J& h7 ^% X& W* ?
  49. 析构函数的格式为~类名(),调用时释放内存(资源)
    7 R( g( F) W! `
  50. + ~" u9 P7 o% J- \% e; j
  51. ~类名()不能加参数,没有返回值2 l3 I7 }6 d8 }, y

  52. 0 K- n' v9 f8 s" w
  53. 定义类时, 如果没有定义构造函数和析构函数, 编译器就会生成一个构造函数和析构函数, 只是这个构造和析构函数什么事情也不做。当要使用构造函数和析构函数时就需要自己在类里添加
    : Y* W3 g4 R& ]/ M. t

  54. ' o  E) S, ?5 _% a% a/ d* \
  55. /***** structor_example.cpp *****/  c. d6 ~6 `+ y4 E
  56. #include <iostream>
    . z/ k! S4 J( n, R+ n
  57. #include <string>, I/ C# n- t) |2 c1 N6 T
  58. using namespace std;! _' l/ m1 A3 S" ]3 Z

  59. " y5 w8 h8 f" x' l
  60. class Dog {  //定义一个类,并在里面写了构造函数和析构函数
    9 ~% B, Q, J+ O1 D
  61. public:. f" n9 u/ U! i7 B0 n+ c! O
  62. Dog();: c- R0 {2 ]* \! E, S
  63. ~Dog();
    4 \+ N3 T1 ]' U; y
  64. };
    $ p  n( [4 g7 E  R
  65. . L- k5 L( {$ g9 D% d
  66. int main() {5 {( l- q+ U4 m# L( H+ V# J
  67. Dog dog;  //实例化一个dog对象% \1 c/ Z4 Z. m; R9 F3 u+ y9 c2 |
  68. cout<<"构造与析构函数示例"<<endl;/ d" a8 }, b! a; q! f
  69. return 0;& j" i7 n, }* r( k: t
  70. }
    8 P& c( h& S7 N4 Y! t" ~# I. z
  71. //类的函数可在类里实现,也可在类外实现,在类外实现时需要使用“::”  J: w/ a1 U. d7 ^+ o1 P/ s! ?
  72. Dog::Dog() {
    4 Y# T" F  k7 J( r1 O0 p; `
  73. cout<<"构造函数执行! "<<endl;6 k8 I7 @2 Y! C7 y3 L7 y2 W+ y
  74. }
    6 T7 c, x7 T# e4 e/ U4 \- K
  75. 2 g+ t! ]' q5 Y# [: c6 Q7 F! K/ ]
  76. Dog::~Dog() {9 a0 d* Q6 ?: j- ]
  77. cout<<"析构函数执行! "<<endl;8 c' {: m2 E- o; |- N! W
  78. }
复制代码
执行下面的指令开始编译
  1. g++ structor_example.cpp -o structor_example
    ; Y1 k% R% T2 I/ Z* e! Q
复制代码
执行./structor_example后结果如下
  1. 构造函数执行!, Q, Z- ]( @! p& f9 s
  2. 构造与析构函数示例) O. ^& H& J6 b5 X
  3. 析构函数执行!
复制代码
this指针
每个对象都拥有一个this指针,this指针记录对象的内存地址。this指针是指向类自身数据的指针,简单来说就是指向当前类的当前实例对象。关于类的this指针有以下特点:
, ]/ b" W4 ^/ g; T+ _" Q* V
  • this只能在成员函数中使用,全局函数、静态函数都不能使用this
  • this在成员函数的开始前构造,在成员函数的结束后清除
  • this指针会因编译器不同而有不同的放置位置。可能是栈,寄存器或者全局变量
    $ b: i* K& E6 q
  1. /***** this_pointer_example.cpp *****/
    ' _. M* I5 H  F  f% M; R
  2. #include <iostream>
    $ e" E" `1 b5 r1 J- f
  3. #include <string>
    " \8 m3 m  _) S$ n: j. p* d
  4. using namespace std;
    ' G" U* m" i& O. L
  5. / P) {" S* }8 v9 X! w3 v. d. B" E( l
  6. class Dog {
    $ N  {$ u2 Z+ x$ c- ]! F# e
  7. public:% \) z  ]- @  x+ [7 U( S7 V' `3 d3 p
  8. string name;
    1 k2 z+ a7 H. S/ Q) l% r/ ^
  9. void func();
    " }! i1 P3 t; T; l* |, e% N4 W- S' E
  10. };
    $ X7 a# c6 B8 O/ y# j0 @5 w- w
  11. $ F7 {! D, R: b/ P
  12. int main() {
    . Z$ p: I+ k- c
  13. Dog dog;8 y/ F" t  ^! `7 O7 A+ R
  14. dog.func();) O  W( V5 ?4 P( a' S* D  P2 t
  15. return 0;4 ^2 g% l4 z) G7 ]; c, C
  16. }
    $ ~: ]) o- Q# W
  17. //在类的成员函数里使用了this指针, 并指向了类里的成员name
    5 V9 b, ]  p" r. F8 q, j
  18. void Dog::func() {; N: H* o5 R* o; p8 x' I' [) u6 f& e
  19. this->name = "旺财";
    2 l8 K8 b' z# e% e/ b0 C% d
  20. cout<<"小狗的名字叫: "<<this->name<<endl;
    + P2 O8 K; d% `" r+ J9 r% N0 q) P5 Y# ~
  21. }
复制代码
执行下面的指令开始编译
  1. g++ this_pointer_example.cpp -o this_pointer_example
复制代码
执行./this_pointer_example后结果如下
  1. 小狗的名字叫:旺财' L# N2 c# a  d# b9 d
复制代码
9 d$ `; q) `! w' N( f
转载自嵌入式攻城狮

; x, p" G6 x2 J$ a
  u3 w5 Q( w8 O" I
赞 收藏 评论0 发布时间:2023-9-25 09:44

举报

0个回答

所属标签

相似技术帖

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