学而时习之:C++中的类与对象

128 阅读3分钟

C++ 类与对象

在面向对象编程中,类(class)对象(object) 是最基本的概念,用来描述现实世界中的事物。

  • :是创建对象的模板蓝图,规定了一组相似属性行为
  • 对象:是类的具体实例。例如,“狗”是一个类,而叫“Tommy”的那条狗就是该类的一个对象。

图片翻译与重新生成.png

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)
蓝图 / 模板,用来创建对象。类的实例,拥有具体的值。
未创建对象前不分配内存创建时分配内存
抽象概念,描述结构与行为。真实实体,可被操作。
定义所有对象共有的属性与方法。存储各自的数据,并调用类的方法。
表示通用类型表示具体实例