C++ 基础学习

C++ 基础知识整理(对比Java)

💡 记得之前刚工作的时候跟着大佬做游戏引擎库的作用,主要用到C++ 来书写。最近想在自己的项目中使用C++ 和一些三方交互做一些C++的中间件的NDK,顺便整理下C++的相关知识,希望能帮到刚入行的同学们。大部分人我们在大学都会学过Java,后面的学习整理我都会对比着Java方便大家理解。

📋 目录

  • [一. 基础类型的变量声明和使用&导包](#一. 基础类型的变量声明和使用&导包 "#%E4%B8%80-%E5%9F%BA%E7%A1%80%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%8F%98%E9%87%8F%E5%A3%B0%E6%98%8E%E5%92%8C%E4%BD%BF%E7%94%A8%E5%AF%BC%E5%8C%85")
  • [二. 函数使用](#二. 函数使用 "#%E4%BA%8C-%E5%87%BD%E6%95%B0%E4%BD%BF%E7%94%A8")
  • [三. 控制流](#三. 控制流 "#%E4%B8%89-%E6%8E%A7%E5%88%B6%E6%B5%81")
  • [四. 数组、向量、字符串](#四. 数组、向量、字符串 "#%E5%9B%9B-%E6%95%B0%E7%BB%84%E5%90%91%E9%87%8F%E5%AD%97%E7%AC%A6%E4%B8%B2")
  • [五. IO 控制](#五. IO 控制 "#%E4%BA%94-io-%E6%8E%A7%E5%88%B6")
  • [六. 类或对象](#六. 类或对象 "#%E5%85%AD-%E7%B1%BB%E6%88%96%E5%AF%B9%E8%B1%A1")

一. 基础类型的变量声明和使用&导包

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    // 整数变量
    int age = 25;
    std::cout << "Age: " << age << std::endl;

    // 浮点数变量
    double pi = 3.14159;
    std::cout << "Pi: " << pi << std::endl;

    // 字符变量
    char grade = 'A';
    std::cout << "Grade: " << grade << std::endl;

    // 布尔变量
    bool isStudent = true;
    std::cout << "Is student: " << (isStudent ? "Yes" : "No") << std::endl;

    // 字符串变量
    std::string name = "Alice";
    std::cout << "Name: " << name << std::endl;

    return 0;
}

🔍 #include <string> 相当于 Java 的 import,导入的包用 <> 来括起来。

还有些基础的类型:

  • ✅ 内置类型(如 intchar)是语言核心,基础数据类型,不在命名空间
  • ✅ 标准库组件(如 vectorstring)放在 std 中以避免命名冲突

这里的命名空间和 Java 类似,只是调用不同,命名空间类名 + :: 来访问。


二. 函数使用

普通函数使用

cpp 复制代码
#include <iostream>

// 函数定义
int add(int a, int b) {
    return a + b;
}

double multiply(double x, double y) {
    return x * y;
}

void greet(std::string name) {
    std::cout << "Hello, " << name << "!" << std::endl;
}

int main() {
    // 函数调用
    int sum = add(5, 3);
    std::cout << "5 + 3 = " << sum << std::endl;

    double product = multiply(4.5, 2.0);
    std::cout << "4.5 * 2.0 = " << product << std::endl;

    greet("World");

    return 0;
}

上面的函数基础调用和 Java 并没有大的区别。String 为非基础类型,存在标准库的命名空间。

函数传递机制的不同

  1. 引用传递 🔗

    cpp 复制代码
    void incrementByRef(int &value) {
        value += 10;
    }
    
    int num1 = 5;
    std::cout << "Before incrementByRef: " << num1 << std::endl;
    incrementByRef(num1);
    std::cout << "After incrementByRef: " << num1 << std::endl;  // 输出: 15

    函数内的行为会作用在函数的外部,为引用传递,以 & 为标识,且引用变量不能为空。

  2. 指针传递 📍

    cpp 复制代码
    void incrementByPtr(int *value) {
        if (value) {
            *value += 20;
        }
    }
    
    int num2 = 5;
    std::cout << "Before incrementByPtr: " << num2 << std::endl;
    incrementByPtr(&num2);
    std::cout << "After incrementByPtr: " << num2 << std::endl;  // 输出: 25

    使用 * 修改原变量,指针本身是不安全的,需要判断是否为空,因为指针本身是可以为空指针,指针可以重新指定新的地址。


三. 控制流

cpp 复制代码
int main() {
    // if-else 条件语句
    int score = 85;
    if (score >= 90) {
        std::cout << "Excellent!" << std::endl;
    } else if (score >= 70) {
        std::cout << "Good!" << std::endl;
    } else {
        std::cout << "Needs improvement." << std::endl;
    }

    // for 循环
    std::cout << "For loop: ";
    for (int i = 1; i <= 5; ++i) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // while 循环
    std::cout << "While loop: ";
    int count = 1;
    while (count <= 5) {
        std::cout << count << " ";
        ++count;
    }
    std::cout << std::endl;

    return 0;
}

其主要和 Java 的区别是:

  1. switch 语句 🔀

    • C++:case 后可不加 break(会 fall through)
    • Java:必须加 break 或 return,否则编译错误
  2. goto 语句 🚀

    • C++:支持 goto 跳转
    • Java:不支持 goto
    cpp 复制代码
    goto label;
    std::cout << "This won't print" << std::endl;  // 不会执行
    
    label:
    std::cout << "Jumped here!" << std::endl;  // 会执行
  3. 布尔表达式

    • C++:整数 0 为 false,非 0 为 true
    • Java:必须使用 boolean 类型

四. 数组、向量、字符串

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>

int main() {
    // 数组
    int arr[5] = {1, 2, 3, 4, 5};
    std::cout << "Array: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    // 向量(动态数组)
    std::vector<int> vec = {10, 20, 30};
    vec.push_back(40);
    std::cout << "Vector: ";
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 字符串操作
    std::string str = "Hello";
    str += " World";
    std::cout << "String: " << str << std::endl;
    std::cout << "Length: " << str.length() << std::endl;

    return 0;
}

和 Java 的主要区别:

  1. 数组 📊

    • C++:固定大小,如 int arr[5];,无内置方法
    • Java:对象,有 length 属性,如 int[] arr = new int[5];
  2. 向量(动态数组) 📈

    • C++:std::vector,自动管理内存,支持 push_back 等
    • Java:ArrayList,类似但需泛型,如 ArrayList<Integer> list
  3. 字符串 📝

    • C++:std::string,可变,支持 += 连接
    • Java:String 不可变,StringBuilder 可变
  4. 内存管理 🧠

    • C++:手动管理(数组)或自动(vector)
    • Java:垃圾回收,数组和集合自动管理
  5. 性能

    • C++:更高效,但需小心内存泄漏
    • Java:更安全,但有 GC 开销

五. IO 控制

cpp 复制代码
#include <iostream>
#include <fstream>

int main() {
    // 文件输出
    std::ofstream outFile("example.txt");
    if (outFile.is_open()) {
        outFile << "Hello, file!" << std::endl;
        outFile.close();
    }

    // 文件输入
    std::ifstream inFile("example.txt");
    if (inFile.is_open()) {
        std::string line;
        while (std::getline(inFile, line)) {
            std::cout << "Read: " << line << std::endl;
        }
        inFile.close();
    }

    return 0;
}

⚠️ 这里注意的是 inFile.close() 这里需要,不然会导致内存泄露,且可以处理文本和二进制,使用 >><< 操作符。


六. 类或对象

cpp 复制代码
#include <iostream>

class Person {
private:
    std::string name;
    int age;

public:
    // 构造函数
    Person(std::string n, int a) : name(n), age(a) {}

    // 方法
    void introduce() {
        std::cout << "Hi, I'm " << name << ", " << age << " years old." << std::endl;
    }

    // 析构函数
    ~Person() {
        std::cout << name << " is being destroyed." << std::endl;
    }
};

int main() {
    // 创建对象
    Person person("Alice", 25);
    person.introduce();

    return 0;
}

支持初始化列表:Person(std::string n, int a) : name(n), age(a) {} 相当于 Java 的 this.name = name

和 Java 的区别:

  1. 析构函数 🗑️

    • C++:有析构函数 ~ClassName(),用于清理资源
    • Java:无析构函数,使用 finalize() 方法
  2. 默认构造函数 🏗️

    • C++:如果未定义,会生成默认构造函数
    • Java:如果未定义,会生成无参构造函数
  3. 内存分配 💾

    • C++:构造函数不分配内存,对象在栈或堆
    • Java:new 关键字在堆上分配内存

C++ 类析构函数主要用于:

  • 管理动态分配的内存(使用 new
  • 释放文件句柄、数据库连接等资源
  • 清理其他系统资源

🎉 希望这份整理能帮助到正在学习C++的同学们!如果有疑问或需要补充,欢迎交流。

相关推荐
_前端小李_5 小时前
关于this指向
前端·javascript
qb5 小时前
vue3.5.18-编译-生成ast树
前端·vue.js·架构
littleplayer5 小时前
Combine在swiftUI中的使用
前端
我的写法有点潮5 小时前
Vue实例都做了什么?
前端·javascript·vue.js
写代码的stone5 小时前
如何基于react useEffect实现一个类似vue的watch功能
前端·javascript·面试
大模型RAG和Agent技术实践5 小时前
探寻卓越:高级RAG技术、架构与实践深度解析
架构
仙人掌一号5 小时前
Webpack打包流程简述——新手向
前端·javascript
用户47949283569155 小时前
面试官:你知道deepseek的ai生成代码预览是用什么做的吗?
前端·javascript·面试
六月的可乐5 小时前
AI助理前端UI组件-悬浮球组件
前端·人工智能