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

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

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

C语言里,变量初始化必须在程序的前面,而C++则可以随用随定义。C++也可以直接初始化,比如 int x(100),这样就直接赋值 x=100C++的输入输出方式:以cin和cout代替了C语言里的scanf和printf
cout语法形式:
  1. cout << x << endl;
  2. // x 可以是任意数据类型(或表达式)
  3. // endl 是换行符,与C里的"\n"效果一样
  4. cout << x << y << endl;  //多个变量的输出
复制代码
cin 语法形式:
  1. cin >> x;  //x可以是任意数据类型
  2. cin >> x >> y; //多个变量的输入
复制代码

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

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. cout << "Hello, World!" << endl;
  5. return 0;
  6. }
复制代码
上面程序中,头文件要写成iostream,因为是标准输入输出流;带".h"的是非标准输入输出流。using是编译指令,声明当前命名空间的关键词,可理解成使用命名空间std,因为cin和cout都是属于std命名空间的,所以使用时须加上using namespace std,也可以写成std::cin和std::cout,其中 :: 表示作用域
为什么要使用命名空间呢?一些名字易冲突,所以会使用命名空间的方式进行区分,具体来说就是加个前缀。比如C++标准库里面定义了vector容器,自己又写了个vector类,这时名字就冲突了。于是使用标准库里的名字时,都要加上std::的前缀,即std::vector来引用。经常写全名比较繁琐,所以在名字没有冲突的情况下可以添加using namespace std,那么接下去使用标准库里的名字时就可以不用再写std::前缀了
  1. /***** namespace_example.cpp *****/
  2. #include <iostream>
  3. using namespace std;
  4. namespace A { //自定义命名空间A
  5. int x = 1;
  6. void fun() {
  7.   cout<<"A namespace"<<endl;
  8. }
  9. }
  10. using namespace A; //声明使用命名空间A
  11. int main(){
  12. fun(); //声明使用命名空间A后,可直接使用fun()
  13. A::x = 3; //将A命名空间下的x重新赋值为3
  14. cout<<A::x<<endl;
  15. A::fun();
  16. return 0;
  17. }
复制代码
执行下面的指令开始编译
  1. g++ namespace_example.cpp -o namespace_example
复制代码
执行./namespace_example后结果如下
  1. A namespace
  2. 3
  3. Anamespace
复制代码
二. C++面向对象

面向对象的三大特征是继承,多态和封装
2.1 类和对象
类是C++的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员,函数在一个类中被称为类的成员。从类中实例化对象分两种方法,一种是从栈中实例化对象,一种是从堆中实例化对象

  1. /***** class_dog_example.cpp *****/
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;

  5. class Dog {  //定义一个类
  6. public:   //访问限定符public(公有的),不写的话默认是private
  7. string name;
  8. int age;

  9. void run() { //定义一个方法
  10.   cout<<"小狗的名字是:"<<name<<","<<"年龄是"<<age<<endl;
  11. }
  12. };

  13. int main() {
  14. /* 从栈中实例化一个对象dog1 */
  15. Dog dog1;
  16. dog1.name = "旺财"; //为dog1的成员变量赋值
  17. dog1.age = 2;  //为dog1的成员变量赋值
  18. dog1.run();   //调用run()方法,打印dog1的相关变量信息
  19. /* 从堆中实例化对象,使用关键字new的都是从堆中实例化对象 */
  20. Dog *dog2 = new Dog();
  21. if (NULL == dog2) { //从堆中实例化对象需要开辟内存,指针会指向那个内存
  22.   return 0;
  23. }
  24. dog2->name = "富贵"; //为dog2的成员变量赋值
  25. dog2->age = 1;   //为dog2的成员变量赋值
  26. dog2->run();   //调用run()方法,打印dog2的相关变量信息

  27. delete dog2;   //释放内存
  28. dog2 = NULL;   //将dog2重新指向NULL
  29. return 0;
  30. }
  31. 执行下面的指令开始编译

  32. g++ class_dog_example.cpp -o class_dog_example
  33. 执行./class_dog_example后结果如下

  34. 小狗的名字是:旺财,年龄是2
  35. 小狗的名字是:富贵,年龄是1
  36. ⏩ 构造函数与析构函数
  37. 构造函数在对象实例化时被系统自动调用,仅且调用一次。构造函数的特点如下:
  38. 构造函数必须与类名同名

  39. 可以重载,没有返回类型

  40. 构函数在对象结束其生命周期时系统自动执行。析构函数的特点如下:
  41. 析构函数的格式为~类名(),调用时释放内存(资源)

  42. ~类名()不能加参数,没有返回值

  43. 定义类时, 如果没有定义构造函数和析构函数, 编译器就会生成一个构造函数和析构函数, 只是这个构造和析构函数什么事情也不做。当要使用构造函数和析构函数时就需要自己在类里添加

  44. /***** structor_example.cpp *****/
  45. #include <iostream>
  46. #include <string>
  47. using namespace std;

  48. class Dog {  //定义一个类,并在里面写了构造函数和析构函数
  49. public:
  50. Dog();
  51. ~Dog();
  52. };

  53. int main() {
  54. Dog dog;  //实例化一个dog对象
  55. cout<<"构造与析构函数示例"<<endl;
  56. return 0;
  57. }
  58. //类的函数可在类里实现,也可在类外实现,在类外实现时需要使用“::”
  59. Dog::Dog() {
  60. cout<<"构造函数执行! "<<endl;
  61. }

  62. Dog::~Dog() {
  63. cout<<"析构函数执行! "<<endl;
  64. }
复制代码
执行下面的指令开始编译
  1. g++ structor_example.cpp -o structor_example
复制代码
执行./structor_example后结果如下
  1. 构造函数执行!
  2. 构造与析构函数示例
  3. 析构函数执行!
复制代码
this指针
每个对象都拥有一个this指针,this指针记录对象的内存地址。this指针是指向类自身数据的指针,简单来说就是指向当前类的当前实例对象。关于类的this指针有以下特点:

  • this只能在成员函数中使用,全局函数、静态函数都不能使用this
  • this在成员函数的开始前构造,在成员函数的结束后清除
  • this指针会因编译器不同而有不同的放置位置。可能是栈,寄存器或者全局变量

  1. /***** this_pointer_example.cpp *****/
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;

  5. class Dog {
  6. public:
  7. string name;
  8. void func();
  9. };

  10. int main() {
  11. Dog dog;
  12. dog.func();
  13. return 0;
  14. }
  15. //在类的成员函数里使用了this指针, 并指向了类里的成员name
  16. void Dog::func() {
  17. this->name = "旺财";
  18. cout<<"小狗的名字叫: "<<this->name<<endl;
  19. }
复制代码
执行下面的指令开始编译
  1. g++ this_pointer_example.cpp -o this_pointer_example
复制代码
执行./this_pointer_example后结果如下
  1. 小狗的名字叫:旺财
复制代码

转载自嵌入式攻城狮


收藏 评论0 发布时间:2023-9-25 09:44

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版