C++ 类与对象
在面向对象编程中,类(class) 与 对象(object) 是最基本的概念,用来描述现实世界中的事物。
- 类:是创建对象的模板或蓝图,规定了一组相似属性与行为。
- 对象:是类的具体实例。例如,“狗”是一个类,而叫“Tommy”的那条狗就是该类的一个对象。
C++ 类(Class)
类是一种用户自定义的数据类型,内部包含 数据成员(变量)和 成员函数(方法)。必须先定义类,才能通过它创建对象(实例)。
1.定义语法
使用关键字
class,后跟类名和类体{}。
示例:
#include <iostream>
using namespace std;
// 类定义(模板)
class GfG{
public:
int val; // 数据成员
void show() // 成员函数(类内定义)
{
cout << "Value: " << val << endl;
}
};
int main()
{
// 此处将创建对象
return 0;
}
说明
- 上述代码仅给出类的“蓝图”,尚未创建任何对象。
- 成员函数也可只在类内声明,然后在类外通过
类名::函数名的方式定义。
C++ 对象(Objects)
- 类只是“模板”,定义了属性(数据)和行为(函数),不占用内存。
- 对象才是根据模板创建的实体,是真正占用内存、可以参与运算的变量。
- 一个类可以创建任意数量的对象。
1.创建对象
写法与普通变量一样:
类名 对象名;
2.访问成员
- 类内:直接用成员名
- 类外:
- 数据成员:
对象名.变量名 - 成员函数:
对象名.函数名()
- 数据成员:
3.C++对象初始化与Java对比
C++ 的对象初始化语法比 Java 更丰富,但 “看起来最像” Java 的那一种”**就是直接用 类名 对象名(实参),不需要 new——除非你要 显式创建在堆上 的 “指针版” 。
下面给出 3 种最常见写法的对比 demo,一眼就能看出来和 Java 的区别。
#include <iostream>
using namespace std;
class A {
int x;
public:
A(int v) : x(v) { // 构造函数
cout << "A(" << x << ")" << endl;
}
void show() { cout << "x = " << x << endl; }
};
int main() {
/* 1. 栈对象 —— 最常用,离开作用域自动析构 */
A a1(10); // 等价 Java:做不到!没有栈对象概念
a1.show();
/* 2. 堆对象 + 指针 —— 这时候有点像 Java 的 “new” */
A* a2 = new A(20); // 等价 Java:A a = new A(20);
a2->show();
delete a2; // 手动释放,Java 由 GC 做
/* 3. 现代 C++ 推荐:智能指针,不用自己 delete */
auto a3 = make_unique<A>(30); // #include <memory>
a3->show();
return 0;
}
运行结果
A(10)
x = 10
A(20)
x = 20
A(30)
x = 30
一句话总结
- Java 只有一种“引用 + new + GC”模型;
- C++ 默认把对象直接建在栈上,语法更简洁;只有需要动态生命周期时才
new/make_unique/make_shared,并且要自己(或智能指针)管释放。
嵌套类(Nested Class)
嵌套类是定义在另一个类内部的类。
作为 外部类 的成员,它享有与普通成员一样的访问权限;但外部类并不能自动访问嵌套类的私有成员,仍需遵守常规访问规则。
示例:
#include <iostream>
using namespace std;
class Outer
{
public:
// 嵌套类
class Inner
{
public:
void display()
{
cout << "This is the Inner class" << endl;
}
};
void show()
{
cout << "This is the Outer class" << endl;
}
};
int main()
{
Outer outerObj; // 创建外部类对象
outerObj.show();
Outer::Inner innerObj; // 创建嵌套类对象
innerObj.display();
return 0;
}
使用要点:
- 嵌套类名需通过外部类名::嵌套类名访问
- 嵌套类对象与外部类对象彼此独立,没有隐含的 this 关联
枚举类(Enum Class)
C++ 中的 enum class 是一种更安全、更有组织的枚举方式。它将相关常量分组,同时避免命名冲突并提供更强的类型检查。
类(Class)与对象(Object)的核心区别
| 类(Class) | 对象(Object) |
|---|---|
| 蓝图 / 模板,用来创建对象。 | 类的实例,拥有具体的值。 |
| 未创建对象前不分配内存。 | 创建时分配内存。 |
| 抽象概念,描述结构与行为。 | 真实实体,可被操作。 |
| 定义所有对象共有的属性与方法。 | 存储各自的数据,并调用类的方法。 |
| 表示通用类型。 | 表示具体实例。 |