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
,导入的包用 <>
来括起来。
还有些基础的类型:
- ✅ 内置类型(如
int
、char
)是语言核心,基础数据类型,不在命名空间 - ✅ 标准库组件(如
vector
、string
)放在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
为非基础类型,存在标准库的命名空间。
函数传递机制的不同
-
引用传递 🔗
cppvoid 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
函数内的行为会作用在函数的外部,为引用传递,以
&
为标识,且引用变量不能为空。 -
指针传递 📍
cppvoid 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 的区别是:
-
switch 语句 🔀
- C++:case 后可不加 break(会 fall through)
- Java:必须加 break 或 return,否则编译错误
-
goto 语句 🚀
- C++:支持 goto 跳转
- Java:不支持 goto
cppgoto label; std::cout << "This won't print" << std::endl; // 不会执行 label: std::cout << "Jumped here!" << std::endl; // 会执行
-
布尔表达式 ✅
- 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 的主要区别:
-
数组 📊
- C++:固定大小,如
int arr[5];
,无内置方法 - Java:对象,有 length 属性,如
int[] arr = new int[5];
- C++:固定大小,如
-
向量(动态数组) 📈
- C++:
std::vector
,自动管理内存,支持 push_back 等 - Java:
ArrayList
,类似但需泛型,如ArrayList<Integer> list
- C++:
-
字符串 📝
- C++:
std::string
,可变,支持 += 连接 - Java:
String
不可变,StringBuilder
可变
- C++:
-
内存管理 🧠
- C++:手动管理(数组)或自动(vector)
- Java:垃圾回收,数组和集合自动管理
-
性能 ⚡
- 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 的区别:
-
析构函数 🗑️
- C++:有析构函数
~ClassName()
,用于清理资源 - Java:无析构函数,使用
finalize()
方法
- C++:有析构函数
-
默认构造函数 🏗️
- C++:如果未定义,会生成默认构造函数
- Java:如果未定义,会生成无参构造函数
-
内存分配 💾
- C++:构造函数不分配内存,对象在栈或堆
- Java:
new
关键字在堆上分配内存
C++ 类析构函数主要用于:
- 管理动态分配的内存(使用
new
) - 释放文件句柄、数据库连接等资源
- 清理其他系统资源
🎉 希望这份整理能帮助到正在学习C++的同学们!如果有疑问或需要补充,欢迎交流。