C++入门讲解5:类与对象全解析从基础语法到实战应用

目录

一、类与对象的核心关系

二、类的声明与对象定义

[1. 类的声明格式](#1. 类的声明格式)

[2. 对象的定义](#2. 对象的定义)

三、类的成员访问方式

[1. 对象名 + 成员运算符(.)](#1. 对象名 + 成员运算符(.))

[2. 对象指针(->)](#2. 对象指针(->))

[3. 对象引用(&)](#3. 对象引用(&))

四、类的封装与信息隐藏

[1. 封装的核心思想](#1. 封装的核心思想)

[2. 多文件分离实现(推荐实践)](#2. 多文件分离实现(推荐实践))

五、构造函数与析构函数

[1. 构造函数:对象的"初始化器"](#1. 构造函数:对象的“初始化器”)

常用形式:

[2. 析构函数:对象的"清理工"](#2. 析构函数:对象的“清理工”)

调用时机与顺序:

六、实战练习:求3个长方体的体积

需求:

参考代码:


作为C++面向对象编程的核心,"类与对象"是告别面向过程思维的关键。本文基于系统的知识点梳理,从概念到实战,带大家一步步掌握类的声明、成员操作、封装特性、构造/析构函数等核心内容,最后附上实验报告模板与提交要求,助力新手快速上手~

一、类与对象的核心关系

  • :是对象的抽象模板,描述某一批对象的共同特性(如"长方体"类定义了长、宽、高等属性和计算体积的方法),不占用内存空间。

  • 对象:是类的具体实例(如"第一个长方体""第二个长方体"),占用内存,具备类定义的所有属性和行为。

  • 类比理解:类是"手机设计图纸",对象是根据图纸生产的具体手机。

二、类的声明与对象定义

1. 类的声明格式

类的声明类似结构体,关键字由struct改为class,包含私有(private)和公有(public)成员,必须以分号结束:

cpp 复制代码
class 类名 {
private:
    // 私有数据成员和成员函数(类外不可直接访问)
    数据类型 成员变量名;
    返回值类型 成员函数名(参数);
public:
    // 公共数据成员和成员函数(类外可访问,是对外接口)
    数据类型 成员变量名;
    返回值类型 成员函数名(参数);
};

示例(矩形类):

cpp 复制代码
class Rectangle {
private:
    int length, width, area, perimeter; // 私有属性,类外不可直接修改
public:
    void CalculateArea() { area = length * width; } // 计算面积
    void CalculatePerimeter() { perimeter = (length + width) * 2; } // 计算周长
    void Display() { // 输出属性
        cout << "长:" << length << endl;
        cout << "宽:" << width << endl;
        cout << "面积:" << area << endl;
        cout << "周长:" << perimeter << endl;
    }
};

2. 对象的定义

声明类后,通过以下格式定义对象(class关键字可省略):

cpp 复制代码
类名 对象名1, 对象名2, ...;

示例:

cpp 复制代码
Rectangle rect1, rect2; // 定义两个矩形对象

三、类的成员访问方式

类的成员(变量/函数)需通过特定方式访问,核心规则:类外只能直接访问公有成员,私有成员需通过公有成员函数间接访问

1. 对象名 + 成员运算符(.)

最常用的访问方式,格式:对象名.成员变量名 / 对象名.成员函数名()

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

class Worker {
public:
    int num;
    string name;
    float salary;
    void Show() { // 公有成员函数
        cout << "工号:" << num << endl;
        cout << "姓名:" << name << endl;
        cout << "工资:" << salary << endl;
    }
};

int main() {
    Worker work1;
    work1.num = 1; // 访问公有成员变量
    work1.name = "张三";
    work1.salary = 4000;
    work1.Show(); // 调用公有成员函数
    return 0;
}

运行结果:

cpp 复制代码
工号:1
姓名:张三
工资:4000

2. 对象指针(->)

通过指针指向对象,间接访问成员,格式:指针变量->成员变量名

cpp 复制代码
int main() {
    Worker work1, *p;
    p = &work1; // 指针指向对象
    p->num = 2;
    p->name = "李四";
    p->salary = 5000;
    p->Show();
    return 0;
}

3. 对象引用(&)

引用是对象的别名,与对象共享内存,访问方式同对象名:

cpp 复制代码
int main() {
    Worker work1;
    Worker &work2 = work1; // work2是work1的别名
    work2.num = 3;
    work2.name = "王五";
    work1.Show(); // 输出work2的赋值结果
    return 0;
}

四、类的封装与信息隐藏

1. 封装的核心思想

将类的私有实现 (数据成员)与公有接口(成员函数)分离:

  • 私有成员(private):隐藏内部数据,防止外界误操作(如直接修改矩形的长为负数)。

  • 公有成员函数:作为对外唯一接口,间接操作私有成员,保证数据合法性。

2. 多文件分离实现(推荐实践)

当类被多个程序复用,建议将"类声明"和"成员函数实现"分离到不同文件:

  • 头文件(.h):存放类声明(如Rectangle.h)。

  • 源文件(.cpp):存放成员函数实现(如Rectangle.cpp)。

  • 主程序(main.cpp):包含头文件,使用类。

示例:

// Rectangle.h

cpp 复制代码
class Rectangle {
private:
    int length, width;
public:
    void SetValue(int l, int w);
    void DisplayArea();
};

// Rectangle.cpp

cpp 复制代码
#include <iostream>
#include "Rectangle.h"
using namespace std;

void Rectangle::SetValue(int l, int w) { // 域限定符::指定所属类
    length = l;
    width = w;
}

void Rectangle::DisplayArea() {
    cout << "面积:" << length * width << endl;
}

// main.cpp

cpp 复制代码
#include <iostream>
#include "Rectangle.h"
using namespace std;

int main() {
    Rectangle rect;
    rect.SetValue(5, 4);
    rect.DisplayArea(); // 输出:面积:20
    return 0;
}

五、构造函数与析构函数

1. 构造函数:对象的"初始化器"

作用:定义对象时自动调用,初始化对象的私有成员(解决私有成员无法直接赋值的问题)。

核心特性:

  1. 函数名与类名完全一致。

  2. 无返回类型(包括void)。

  3. 可重载(多个构造函数,参数表不同)。

  4. 未自定义时,系统自动生成空构造函数。

常用形式:

无参构造函数(默认初始化):

cpp 复制代码
class Time {
private:
    int hour, minute, second;
public:
    Time() { // 无参构造函数
        hour = 0;
        minute = 0;
        second = 0;
    }
};

带参构造函数(自定义初始化):

cpp 复制代码
class Box {
private:
    int length, width, height;
public:
    Box(int l, int w, int h) { // 带参构造
        length = l;
        width = w;
        height = h;
    }
    int Volume() { return length * width * height; }
};

// 调用:
Box box1(1,2,3);
cout << "体积:" << box1.Volume() << endl; // 输出:6

参数初始化表(更简洁的初始化):

cpp 复制代码
Box(int l, int w, int h) : length(l), width(w), height(h) { }

重载构造函数(多种初始化选择):

cpp 复制代码
class Circle {
private:
    float radius;
public:
    Circle() { radius = 10.0; } // 无参(默认半径10)
    Circle(float r) { radius = r; } // 带参(自定义半径)
    float Area() { return 3.14159 * radius * radius; }
};

2. 析构函数:对象的"清理工"

作用:对象生命周期结束时自动调用,释放资源(如动态内存、文件句柄)。

核心特性:

  1. 函数名前加~,与类名一致。

  2. 无返回类型、无参数、不可重载。

  3. 未自定义时,系统自动生成空析构函数。

调用时机与顺序:
  • 局部对象:函数调用结束时调用。

  • 全局对象:程序结束时调用。

  • 动态对象(new创建):delete时调用。

  • 顺序:先构造的后析构,后构造的先析构(类似栈的"先进后出")。

示例:

cpp 复制代码
class Box {
public:
    Box(int l) { cout << "构造对象,长度:" << l << endl; }
    ~Box() { cout << "析构对象" << endl; }
};

int main() {
    Box b1(1); // 构造1
    Box b2(2); // 构造2
    return 0;
}
// 输出顺序:
// 构造对象,长度:1
// 构造对象,长度:2
// 析构对象
// 析构对象

六、实战练习:求3个长方体的体积

需求:

  1. 定义长方体类(Cuboid),数据成员:长、宽、高。

  2. 用成员函数实现:键盘输入3个长方体的尺寸、计算体积、输出结果。

参考代码:

cpp 复制代码
#include <iostream>
using namespace std;

class Cuboid {
private:
    int length, width, height;
public:
    void Input() { // 输入尺寸
        cout << "请输入长、宽、高:";
        cin >> length >> width >> height;
    }
    int Volume() { return length * width * height; }
};

int main() {
    Cuboid c1, c2, c3;
    c1.Input();
    c2.Input();
    c3.Input();
    cout << "长方体1体积:" << c1.Volume() << endl;
    cout << "长方体2体积:" << c2.Volume() << endl;
    cout << "长方体3体积:" &lt;&lt; c3.Volume() &lt;&lt; endl;
    return 0;
}
相关推荐
a程序小傲8 小时前
阿里Java面试被问:.Java 8中Stream API的常用操作和性能考量
开发语言·windows·python
酷酷的佳8 小时前
C语言--数组作为函数参数
c++
爱装代码的小瓶子8 小时前
【c++进阶】从C++98到C++11的奇妙旅程(故事科普版)
开发语言·c++
智航GIS8 小时前
2.3 运算符详解
开发语言·python
web3.08889998 小时前
接入API-自动化批量获取淘宝商品详情数据
开发语言·python
世转神风-9 小时前
qt-在字符串中指定位置插入字符串
开发语言·qt
时光呀时光慢慢走9 小时前
C# WinForms 实战:MQTTS 客户端开发(与 STM32 设备通信)
开发语言·c#
superman超哥9 小时前
仓颉类型别名的使用方法深度解析
c语言·开发语言·c++·python·仓颉
LFly_ice9 小时前
Next-4-路由导航
开发语言·前端·javascript
3824278279 小时前
python :__call__方法
开发语言·python