C++类和对象

一、基本概念

1. 什么是类(Class)

  • 类是对一类具有相同属性和行为的事物的抽象描述
  • 是一种自定义数据类型 ,是创建对象的模板
  • 组成:成员变量(属性)+ 成员函数(行为)

2. 什么是对象(Object)

  • 对象是类的具体实例
  • 类是抽象的,对象是具体的
  • 例:Person 是类,张三、李四 是对象

二、类的定义语法

cpp

运行

复制代码
class 类名 {
    // 访问权限
public:
    // 公有成员(外部可访问)
    
private:
    // 私有成员(仅类内部可访问)

protected:
    // 保护成员(类内部 + 子类可访问)
};

三种访问权限

  1. public:公有,类内、类外、子类都可访问
  2. private :私有,仅类内成员函数可访问,外部 / 子类不可直接访问
  3. protected:保护,类内 + 子类可访问,外部不可访问

类中未写权限时,默认是 private


三、对象的创建与使用

1. 栈对象(自动变量)

cpp

运行

复制代码
类名 对象名;
对象名.成员;

2. 堆对象(动态分配)

cpp

运行

复制代码
类名 *对象指针 = new 类名;
对象指针->成员;
delete 对象指针;

示例

cpp

运行

复制代码
class Student {
public:
    string name;
    int age;

    void show() {
        cout << name << " " << age << endl;
    }
};

int main() {
    // 栈对象
    Student s;
    s.name = "小明";
    s.age = 18;
    s.show();

    // 堆对象
    Student *p = new Student;
    p->name = "小红";
    p->age = 19;
    p->show();
    delete p;
    return 0;
}

四、封装(核心思想)

1. 封装含义

  • 属性和行为捆绑在一起
  • 对外部隐藏实现细节,只开放安全接口
  • 防止外部随意修改内部数据

2. 封装写法

cpp

运行

复制代码
class Person {
private:
    // 私有属性
    string name;
    int age;

public:
    // 公有接口
    void setName(string n) { name = n; }
    void setAge(int a) {
        if (a >= 0 && a <= 150) age = a;
    }
    string getName() { return name; }
    int getAge() { return age; }
};

五、构造函数

1. 作用

  • 创建对象时自动调用
  • 用于初始化对象成员变量

2. 特点

  • 函数名与类名完全相同
  • 无返回值(不写 void)
  • 重载
  • 不手动写时,编译器生成默认无参构造

3. 语法

cpp

运行

复制代码
类名() {
    // 初始化
}

类名(参数列表) {
    // 带参构造
}

示例

cpp

运行

复制代码
class Person {
public:
    string name;
    int age;

    // 无参构造
    Person() {
        name = "无名氏";
        age = 0;
    }

    // 带参构造
    Person(string n, int a) {
        name = n;
        age = a;
    }
};

六、析构函数

1. 作用

  • 对象销毁时自动调用
  • 用于释放对象占用的资源(如动态内存)

2. 特点

  • 函数名:~类名()
  • 无参、无返回值、不能重载
  • 不写时编译器自动生成默认析构

示例

cpp

运行

复制代码
class Test {
public:
    Test()  { cout << "对象创建" << endl; }
    ~Test() { cout << "对象销毁" << endl; }
};

七、this 指针

1. 本质

  • this 是指向当前对象自身的指针
  • 成员函数默认隐含 this 参数

2. 用途

  • 解决成员变量与形参同名冲突
  • 返回对象自身 return *this;

示例

cpp

运行

复制代码
class Person {
private:
    int age;
public:
    void setAge(int age) {
        // this->age 是成员变量,age 是形参
        this->age = age;
    }
};

八、对象数组

cpp

运行

复制代码
// 栈对象数组
Person arr[3];
// 堆对象数组
Person *parr = new Person[3];
delete[] parr;

九、对象的初始化方式

  1. 无参构造:Person p;
  2. 带参构造:Person p("张三", 20);
  3. 赋值初始化:Person p = Person("李四", 21);
  4. 动态创建:Person *p = new Person("王五", 22);

十、核心总结

  1. 类 = 属性 + 行为,是抽象模板
  2. 对象 = 类的实例,是具体实体
  3. 封装:私有属性 + 公有接口,保护数据
  4. 构造函数:创建对象时初始化
  5. 析构函数:销毁对象时释放资源
  6. this 指针:指向当前对象,解决命名冲突
  7. 权限:public 对外开发,private 内部使用
相关推荐
小羊没烦恼!10 分钟前
Memory 记忆设计讨论:为什么 Agent Memory 不能只靠向量数据库?
java·开发语言·windows·算法·c#
FlightYe14 分钟前
音视频修炼之编码器(一):AVC、HEVC编码器内部
android·linux·c++·音视频
黑马程序员毕设25 分钟前
基于微信小程序的节目活动报名与管理系统设计与实现
java·开发语言·spring boot·后端·电脑
羑悻的小杀马特30 分钟前
数据织网者:Jsoncpp库深度解析——从C++原生JSON处理到工程级数据交互实战全攻略
c++·json·交互·jsoncpp·原生库
sunshine22 girl32 分钟前
Java学习 java原理
java·开发语言·学习
ysu_031443 分钟前
08-二叉树遍历:四种方式详解
c语言·数据结构·算法·leetcode
咸鱼老弟44 分钟前
Speculative Decoding(投机采样):大模型"先猜后验",生成速度翻倍
前端·算法·ai编程
果果燕1 小时前
实习笔记(七)GFP自动化插拔测试功能协议解析
c++
荆棘鸟智能1 小时前
AI算法持续学习与迭代怎么做?从数据闭环到灰度发布的MLOps工程实践
人工智能·算法·架构·边缘计算
宁渡AI大模型1 小时前
河南宁渡科技有限公司|宁渡课堂 AI 全栈面试分享,AI 应用开发高频考点汇总
java·c++·人工智能·python·深度学习·神经网络·rag