C++ 类与对象
title: C++ 类与对象 description: 介绍C++面向对象编程中的类与对象基础概念,包括类的定义、对象的创建、成员变量和成员函数的使用,以及构造函数和析构函数的基本知识。
引言
在C++中,类和对象是面向对象编程的核心概念。类是用户自定义的数据类型,它是对象的模板或蓝图,定义了对象可以包含的数据和可以执行的操作。对象则是类的实例,是根据类的定义创建的实体。理解类和对象的概念对于掌握C++的面向对象编程至关重要。
类的基本概念
类是一种用户定义的数据类型,它将数据和操作数据的函数封装在一起。通过类,我们可以创建新的数据类型,这些数据类型具有自己的数据成员和成员函数。
类的定义
在C++中,使用关键字class
来定义类:
class ClassName {
// 访问说明符
private:
// 私有成员
public:
// 公有成员
protected:
// 受保护成员
};
访问说明符
C++中有三种访问说明符:
- private:只能在类内部访问
- public:可以在类外部访问
- protected:只能在类内部和派生类中访问
备注
如果没有指定访问说明符,类默认为private,而结构体默认为public。
创建类和对象
让我们创建一个简单的Student
类作为示例:
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
string name;
int age;
double gpa;
public:
// 成员函数声明
void setInfo(string studentName, int studentAge, double studentGpa);
void displayInfo();
};
// 成员函数定义
void Student::setInfo(string studentName, int studentAge, double studentGpa) {
name = studentName;
age = studentAge;
gpa = studentGpa;
}
void Student::displayInfo() {
cout << "学生姓名: " << name << endl;
cout << "年龄: " << age << endl;
cout << "平均成绩: " << gpa << endl;
}
int main() {
// 创建对象
Student student1;
// 使用对象调用成员函数
student1.setInfo("张三", 20, 3.8);
student1.displayInfo();
return 0;
}
输出结果:
学生姓名: 张三
年龄: 20
平 均成绩: 3.8
类的组成部分
- 成员变量(数据成员):用于存储对象的数据。
- 成员函数(方法):用于操作和访问成员变量的函数。
构造函数和析构函数
构造函数
构造函数是一种特殊的成员函数,它在创建对象时自动调用,用于初始化对象的数据成员。
特点:
- 与类同名
- 没有返回类型,甚至不是void
- 可以重载(多个构造函数)
class Student {
private:
string name;
int age;
double gpa;
public:
// 默认构造函数
Student() {
name = "未命名";
age = 0;
gpa = 0.0;
}
// 带参数的构造函数
Student(string studentName, int studentAge, double studentGpa) {
name = studentName;
age = studentAge;
gpa = studentGpa;
}
void displayInfo() {
cout << "学生姓名: " << name << endl;
cout << "年龄: " << age << endl;
cout << "平均成绩: " << gpa << endl;
}
};
int main() {
// 使用默认构造函数
Student student1;
student1.displayInfo();
// 使用带参数的构造函数
Student student2("李四", 22, 3.5);
student2.displayInfo();
return 0;
}
输出结果:
学生姓名: 未命名
年龄: 0
平均成绩: 0
学生姓名: 李四
年龄: 22
平均成绩: 3.5
析构函数
析构函数是在对象被销毁时自动调用的特殊成员函数,用于释放对象占用的资源。
特点:
- 名称为类名前加上波浪号
~
- 没有返回类型和参数
- 一个类只能有一个析构函数
class DynamicArray {
private:
int* array;
int size;
public:
// 构造函数
DynamicArray(int arraySize) {
size = arraySize;
array = new int[size]; // 动态分配内存
cout << "创建了大小为 " << size << " 的动态数组" << endl;
}
// 析构函数
~DynamicArray() {
delete[] array; // 释放动态分配的内存
cout << "释放了动态数组的内存" << endl;
}
void setValue(int index, int value) {
if(index >= 0 && index < size)
array[index] = value;
}
int getValue(int index) {
if(index >= 0 && index < size)
return array[index];
return -1;
}
};
int main() {
{
DynamicArray arr(5);
arr.setValue(0, 10);
cout << "arr[0] = " << arr.getValue(0) << endl;
} // arr对象离开作用域, 析构函数被调用
cout << "程序继续执行..." << endl;
return 0;
}
输出结果:
创建了大小为 5 的动态数组
arr[0] = 10
释放了动态数组的内存
程序继续执行...
类的内联成员函数
内联成员函数是在类定义内部定义的成员函数,编译器会尝试将其内联展开,这可以提高程序的执行效率。
class Counter {
private:
int count;
public:
// 内联成员函数(在类内定义)
Counter() { count = 0; }
void increment() { count++; }
void decrement() { count--; }
int getCount() { return count; }
};