C++ 类与对象核心概念:定义、封装与实例化
C++ 中的类(Class)是一种用户自定义的数据类型,它将数据(属性)和操作数据的函数(行为)封装在一起。对象是类在内存中的具体存在形式。理解类的定义、访问权限修饰符以及如何正确创建和访问对象,是掌握 C++ 面向对象编程的基础。
什么是类和对象
类是对现实中事物的抽象描述。在 C++ 语境下,任何具有共同特征和操作的事物都可以定义为类。一个标准的类由两部分组成:
- 属性(数据成员):描述事物的特征,通常对应基本数据类型或复杂结构。
- 行为(成员函数):描述事物能做的操作,即函数实现。
对象则是类的实例化结果,即将抽象的类转化为内存中具体的实体。例如,“人类”是一个类,而“张三”就是该类的一个具体对象。C++ 类的三大核心特性为封装、继承和多态。
类的定义与访问权限
C++ 使用 class 关键字来定义类。类的内部成员可以设置不同的访问权限,这是实现封装的关键。
第1步:定义类结构
类的定义必须以分号结尾。在权限限定词之后,可以声明数据成员和成员函数。
#include <iostream>
#include <string>
using namespace std;
class GirlFriend {
// ... 成员声明 ...
}; // 注意末尾的分号不能省略
第2步:配置访问权限修饰符
C++ 提供了三种主要的访问控制权限:
public(公有):类外可以通过对象直接访问。通常用于提供对外接口(如 getter/setter、初始化方法)。protected(保护):仅限类本身及其派生类访问。用于支持继承体系中的共享资源。private(私有):仅限类自身访问。外部无法直接读写,必须通过公有的成员函数进行间接访问。这是数据安全的主要保障。
重要规则:
- 如果类中未显式指定权限修饰符,默认所有成员均为
private。 - 如果是
struct定义的类,默认所有成员均为public。 - 权限限制仅针对类外访问。在类内部的成员函数之间,没有任何访问壁垒。
对象的创建与初始化
定义类后,就可以创建对象。常见的创建方式包括栈分配、堆分配和对象数组。
第1步:普通对象与数组创建
在栈上创建对象时,如果没有提供构造函数,编译器会自动调用默认行为。对于含有成员的对象数组,每个元素都会被独立创建。
第2步:堆动态分配
使用 new 运算符在堆区动态创建对象,需要手动管理内存,使用完毕后务必调用 delete 并置空指针,防止内存泄漏。
成员函数的实现与访问
为了保证数据的安全性,通常不建议直接暴露私有成员变量。应通过公共的成员函数(接口)来控制数据的读写。
第1步:提供初始化接口
在类内直接写逻辑比较简单的方法适合简单类。对于复杂类或在类外实现的函数,需要使用作用域解析运算符 :: 指明函数所属的类。
#include <iostream>
#include <string>
using namespace std;
class GirlFriend {
public:
// 共有接口:初始化数据
void initData(string name, int age) {
m_name = name;
m_age = age;
}
// 共有接口:打印数据
void printData() {
cout << m_name << "\t" << m_age << endl;
}
// 返回值引用:允许类外修改私有成员(需谨慎使用)
string& getName() { return m_name; }
int& getAge() { return m_age; }
protected:
// 保护属性
string m_name;
private:
// 私有属性:类外无法直接访问
int m_age;
};
// 类外实现函数示例(若需分离声明与定义)
// void GirlFriend::initData(string name, int age) {
// m_name = name;
// m_age = age;
// }
int main() {
GirlFriend Lisa;
// 方式1:通过接口初始化
Lisa.initData("Lisa", 19);
Lisa.printData();
// 方式2:通过返回引用的get方法直接赋值
GirlFriend mm;
mm.getName() = "mm";
mm.getAge() = 18;
mm.printData();
// 错误示范:类外无法直接访问私有成员
// Lisa.m_name = "Test"; // 编译错误
return 0;
}
第2步:利用类封装简化数据结构
在处理如链表等复杂数据结构时,将节点数据和操作封装在类中,比纯 C 语言的结构体加函数指针方式更具优势,避免了频繁的类型转换和参数传递。
// 使用类封装链表节点和列表
class Node {
public:
// 提供访问接口以隐藏实现细节
Node*& getNext() { return next; }
int& getData() { return data; }
protected:
int data;
Node* next;
};
class List {
public:
void createList() {
headNode = new Node;
headNode->getNext() = nullptr;
}
void insertData(int data) {
Node* newNode = new Node;
newNode->getNext() = nullptr;
newNode->getData() = data;
// 头插法
newNode->getNext() = headNode->getNext();
headNode->getNext() = newNode;
}
void printList() {
Node* pMove = headNode->getNext();
while (pMove != nullptr) {
cout << pMove->getData() << "\t";
pMove = pMove->getNext();
}
cout << endl;
}
protected:
Node* headNode; // 指向头结点的指针
};
void testList2() {
List* pList = new List;
pList->createList();
pList->insertData(10);
pList->insertData(20);
pList->printList();
delete pList;
}
int main() {
testList2();
return 0;
}
总结
C++ 的类机制通过将数据与行为捆绑,并利用 public/protected/private 权限控制,实现了信息隐藏和模块化。在实际开发中,应优先使用类提供的公共接口(如 initData, getName)来访问和修改数据,而不是直接操作成员变量。同时,对于动态创建的对象,记得在不再使用后释放内存,以保证程序的稳定性。以上就是 C++ 类和对象基本概念及操作的详细内容,更多关于 C++ 面向对象编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









