• C++进阶(二)


    目录

    1、Vector2D  默认构造、重载

    2、char 深度理解

    3、深度理解简单的类操作


    1、Vector2D  默认构造、重载

    1. #include <iostream>
    2. #include <cmath>
    3. class Vector2D {
    4. private:
    5. double x; // X坐标
    6. double y; // Y坐标
    7. public:
    8. // 默认构造函数,将向量初始化为(0,0)
    9. Vector2D() : x(0), y(0) {}
    10. // 带有两个参数的构造函数,用于初始化向量的x和y坐标
    11. Vector2D(double x, double y) : x(x), y(y) {}
    12. // 计算向量的长度
    13. double length() const {
    14. return std::sqrt(x * x + y * y);
    15. }
    16. // 重载+运算符,用于向量的加法
    17. Vector2D operator+(const Vector2D& other) const {
    18. return Vector2D(x + other.x, y + other.y);
    19. }
    20. // 打印向量的坐标
    21. void print() const {
    22. std::cout << "(" << x << ", " << y << ")" << std::endl;
    23. }
    24. };
    25. int main() {
    26. Vector2D v1(3, 4);
    27. Vector2D v2(1, 2);
    28. Vector2D v3 = v1 + v2;
    29. v3.print(); // 输出:(4, 6)
    30. return 0;
    31. }

    2、char 深度理解

    背景

    1. char* outex()
    2. {
    3. char szP[32] = "helllo";
    4. return szP;
    5. } 我理解是 szP的栈空间应该是被释放了 那么 return的时候 是把内容复制到返回值了?然后再释放的?
    1. 您的理解是正确的,`szP` 在 `outex` 函数中是一个栈上的局部变量。当函数返回时,这块栈空间会被标记为可以重用,但是不会立即被清零或释放。然而,返回一个栈上局部变量的指针是危险的,因为这块内存随时都可能被其他函数调用或其他局部变量覆盖,导致不确定的行为。
    2. 当您执行以下代码:
    3. ```cpp
    4. char* ptr = outex();
    5. ```
    6. 您得到的 `ptr` 实际上是指向一个已经不再保证其内容的内存区域。这块内存很快就可能被其他操作覆盖。
    7. 要修复这个问题,有以下几种常见方法:
    8. 1. **静态存储**:使变量静态,这样它的生命周期会持续到程序结束。
    9. ```cpp
    10. char* outex() {
    11. static char szP[32] = "hello";
    12. return szP;
    13. }
    14. ```
    15. 注意:这种方法使得每次调用 `outex` 都返回相同的内存地址,所以如果您修改这块内存的内容,将影响所有引用该地址的地方。
    16. 2. **动态内存分配**:使用 `new` (或 `malloc` 在 C 中)为字符串分配堆内存。
    17. ```cpp
    18. char* outex() {
    19. char* szP = new char[32];
    20. strcpy(szP, "hello");
    21. return szP;
    22. }
    23. ```
    24. 如果使用这种方法,您必须确保在使用完返回的指针后使用 `delete[]` (或 `free` 在 C 中)来释放分配的内存,以避免内存泄漏。
    25. 3. **使用 C++ 标准库的字符串**:这是一个更现代和安全的方法。
    26. ```cpp
    27. std::string outex() {
    28. return "hello";
    29. }
    30. ```
    31. 在大多数情况下,推荐使用第三种方法,因为它最简单、安全。

    3、深度理解简单的类操作

    1. #include <iostream>
    2. class SimpleClass {
    3. private:
    4. int value;
    5. public:
    6. SimpleClass(int v) : value(v) {}
    7. int getValue() const {
    8. return value;
    9. }
    10. void setValue(int v) {
    11. value = v;
    12. }
    13. };
    14. int main() {
    15. SimpleClass obj(5);
    16. std::cout << "Initial value: " << obj.getValue() << std::endl;
    17. obj.setValue(10);
    18. std::cout << "Updated value: " << obj.getValue() << std::endl;
    19. return 0;
    20. }
    1. 这个程序首先定义了一个名为`SimpleClass`的类,然后在`main`函数中实例化并使用该类。下面是其深层次的工作原理:
    2. 1. **内存模型**
    3. `SimpleClass obj(5);`这行代码执行时,编译器在栈上为`SimpleClass`对象分配内存。这意味着`obj`对象的生命周期限制在其声明的作用域内,一旦离开这个作用域(例如`main`函数结束时),对象就会被销毁。
    4. 2. **构造函数**
    5. `SimpleClass(int v) : value(v) {}`是一个带有一个整数参数的构造函数。在构造函数的初始化列表中,我们直接将成员变量`value`初始化为参数`v`的值。
    6. 3. **成员函数**
    7. `getValue``setValue`是访问器函数,它们允许我们访问和修改私有成员`value`
    8. 4. **数据封装**
    9. 通过将`value`设为`private`,我们确保了它不能直接从类外部访问或修改。这是面向对象编程的基本原则之一,称为封装。
    10. 5. **输入/输出流**
    11. `std::cout`是C++的一个输出流对象,它用于将文本发送到标准输出(通常是屏幕)。`<<`操作符被重载,以便可以与`std::cout`和其他类型的数据一起使用,从而提供连续的输出操作。
    12. 6. **返回值**
    13. `main`函数的返回值通常指示程序的退出状态。返回0通常表示程序成功完成。
    14. 编译和运行该程序会输出:
    15. ```
    16. Initial value: 5
    17. Updated value: 10
    18. ```
    19. 当你编译这段代码时,编译器会执行许多任务,包括但不限于:词法分析、语法分析、语义分析、优化和代码生成。然后链接器接手,解析库依赖关系,并生成可执行文件。

  • 相关阅读:
    1474_AURIX TC275 WDT的运行模式
    移动端css问题
    C语言程序设计笔记(浙大翁恺版) 第六周:数据类型
    计算机网络第3章(数据链路层)-----总结1
    微信小程序开发流程
    【Flutter -- GetX】准备篇
    笙默考试管理系统-MyExamTest----codemirror(22)
    Linux用户管理— 用户组管理命令
    Vue2.0开发之——webpack基础-打包发布项目(10)
    大屏开发,浏览器的可视区域和设备的分辨率
  • 原文地址:https://blog.csdn.net/qq_59068750/article/details/132550410