深入浅出 C++ 特有关键字
作为 Java 程序员,看到 C++ 的这些关键字可能会一脸懵。我来用最直白的例子解释这些 Java 里没有的"特殊密码":
1. 内存管理三兄弟
① new
/ delete
- 手动内存管理
cpp
int* num = new int(10); // 手动分配内存
cout << *num; // 输出10
delete num; // 必须手动释放!
➔ Java 只有 new
,垃圾回收自动处理,C++ 要自己 delete
② delete[]
- 删除数组
cpp
int* arr = new int[3]{1,2,3}; // 动态数组
delete[] arr; // 必须用 delete[] 删除数组
➔ Java 数组是对象,自动回收
2. 指针操作双雄
③ *
- 定义指针
cpp
int value = 5;
int* ptr = &value; // ptr存储value的内存地址
cout << *ptr; // 输出5(*解引用)
➔ Java 没有指针概念(引用类似但不同)
④ &
- 取地址/引用
cpp
int a = 10;
int& ref = a; // ref是a的别名
ref = 20; // 现在a也变成20
➔ Java 的 &
只用于位运算
3. 类操作四天王
⑤ friend
- 友元(打破封装)
cpp
class Teacher {
private:
int salary;
friend class Principal; // 校长可以看老师工资
};
class Principal {
public:
void check(Teacher& t) {
cout << t.salary; // 可以访问私有成员
}
};
➔ Java 没有这种"开后门"机制
⑥ operator
- 运算符重载
cpp
class Vector {
public:
int x,y;
Vector operator+(Vector v) { // 重载+
return Vector{x+v.x, y+v.y};
}
};
Vector v1{1,2}, v2{3,4};
Vector v3 = v1 + v2; // 现在可以向量相加
➔ Java 不支持运算符重载
⑦ virtual
- 虚函数(多态核心)
cpp
class Animal {
public:
virtual void speak() { // 虚函数
cout << "动物叫";
}
};
class Cat : public Animal {
public:
void speak() override { // 重写
cout << "喵喵";
}
};
Animal* pet = new Cat();
pet->speak(); // 输出"喵喵"(动态绑定)
➔ Java 所有方法默认虚函数(除非 final
)
⑧ explicit
- 禁止隐式转换
cpp
class Student {
public:
explicit Student(int age) {} // 必须显式构造
};
// Student s = 18; ❌ 报错!
Student s(18); // ✅ 必须这样写
➔ Java 构造方法没有这种限制
4. 模板编程三剑客
⑨ template
- 泛型编程
cpp
template<typename T>
T max(T a, T b) { // 万能比较
return a > b ? a : b;
}
cout << max(3,5); // 5
cout << max(3.14, 2.71); // 3.14
➔ Java 用 <T>
泛型,但实现机制不同
⑩ typename
/ class
(模板参数)
cpp
template<class T> // 也可以用 typename
void print(T data) {
cout << data;
}
➔ Java 泛型只支持引用类型
5. 其他特色关键字
⑪ mutable
- 突破const限制
cpp
class Counter {
mutable int count; // 即使在const方法中也能修改
public:
void add() const {
count++; // 正常const函数不能修改成员
}
};
➔ Java 没有这种设计
⑫ asm
- 内联汇编
cpp
asm("mov eax, 5"); // 直接写汇编指令
➔ Java 不能直接操作硬件
⑬ goto
- 跳转语句
cpp
start:
cout << "你好";
goto start; // 无限循环
➔ Java 保留但禁止使用
对比表格
关键字 | C++ 作用 | Java 对应 | 差异点 |
---|---|---|---|
new /delete |
手动内存管理 | 自动GC | C++要手动释放 |
* /& |
指针/引用 | 只有引用 | Java没有真指针 |
friend |
友元类 | 无 | Java严格封装 |
operator |
运算符重载 | 不支持 | Java不能重载+-*/ |
virtual |
虚函数 | 默认虚函数 | Java除非用final |
template |
模板 | 泛型 | C++模板更强大 |
这些就是 Java 程序员需要特别注意的 C++ 特有关键字。刚开始可能会觉得麻烦,但正是这些特性让 C++ 能精细控制内存和性能! 🚀