C++面向对象编程基础:类与对象的定义、成员访问及封装
本文详解C++面向对象核心概念,包括对象与类的抽象关系、面向过程与面向设计的区别。通过完整的代码实例,演示如何定义类、分离头文件实现,以及利用对象名、指针和引用三种方式访问成员,同时探讨内联函数的应用。
什么是对象
C++中的任何事物都可以被视为对象,即“万物皆为对象”。对象由两部分组成:
- 数据(属性):描述对象的状态或特征。
- 函数(行为):描述对象对外界信息的响应操作。
类与对象是抽象与特例的关系:具有相同属性和行为的多个对象可以抽象为一个class(类),类是对象的抽象,而对象则是类的具体实例。
面向过程 vs 面向对象
面向过程
面向过程的设计以功能为核心,程序被视为算法与数据结构的集合,两者独立设计:
- 围绕功能编写,通常用一个函数实现一个具体功能。
- 程序 = 算法 + 数据结构,二者松散耦合。
面向对象
面向对象的设计将数据和处理数据的算法封装在一起:
- 将逻辑和状态统一在对象中。
- 对象 = 算法 + 数据结构。
- 程序运行通过向各个对象发送消息来驱动:程序 = 对象 * N + 消息。
什么是类
类是用户自定义的数据类型,不仅包含数据成员,还包含具备行为能力的成员函数。类定义了创建对象的标准结构。
// 简图示意:Class 指向多个 Object 实例
Object A, Object B...
类的结构与实现
类的基本格式
class Student {
private:
// 私有的数据成员
int num;
string name;
char gender;
public:
// 公共的成员函数(接口)
void set(int n, string p, char g);
void display();
};
工程化代码示例(头文件分离)
实际开发中,建议将类的声明放在 .h 头文件中,实现放在 .cpp 源文件中,并在主程序中调用。这种分离有助于模块化管理和维护。
Student.h (声明):
#ifndef PROJECT1_STUDENT_H
#define PROJECT1_STUDENT_H
#include <iostream>
#include <string>
using namespace std;
class Student {
private: // 私有成员:外界无法直接访问
int num;
string name;
char gender;
public:
// 构造函数
Student(int n, string nme, char g);
// 普通成员函数
void display();
};
#endif //PROJECT1_STUDENT_H
Student.cpp (实现):
#include "Student.h"
#include <iostream>
using namespace std;
// 构造函数实现
Student::Student(int n, string nme, char g) {
num = n;
name = nme;
gender = g;
}
void Student::display() {
cout << "num: " << num << endl;
cout << "name: " << name << endl;
cout << "gender: " << gender << endl;
}
main.cpp (使用):
#include "Student.h"
using namespace std;
int main() {
Student student1(1, "Little white", 'f');
student1.display();
return 0;
}
输出结果:
num: 1
name: Little white
gender: f
类的成员函数访问方式
成员函数根据访问权限修饰符分为 private(私有)、protected(受保护)和 public(公有)。只有 public 部分能被类外部直接调用;private 部分的成员只能通过该类的其他 member function 访问。以下是访问对象的三种常见方法:
第一种:通过对象名和成员运算符(.)访问
这是最基础的方式。创建一个对象实例,直接使用点操作符调用公共方法。
class Time {
private:
int hour, minute, second;
public:
void set_time(int h, int m, int s);
void show_time();
};
int main() {
Time timeObj;
timeObj.set_time(6, 6, 6);
timeObj.show_time(); // 输出: 6:6:6
}
第二种:通过指向对象的指针访问(-> 或 (*).)
当需要动态分配内存或传递参数时使用指针。使用箭头 -> 可以直接解引用并调用成员。
int main() {
Time timeObj;
timeObj.set_time(6, 6, 6);
Time *ptr = &timeObj; // 获取对象地址
ptr->show_time(); // 推荐使用指针调用
(*ptr).show_time(); // 等效写法
}
第三种:通过对象的引用变量访问(&)
引用作为已有变量的别名,它们共享同一段存储单元。使用引用的语法比指针更简洁安全。
int main() {
Time t1;
t1.set_time(6, 6, 6);
Time &t2 = t1; // 引用绑定
t2.show_time(); // 效果等同于操作 t1
return 0;
}
Inline 成员函数优化
对于规模极小且使用频繁的函数(如简单的 Getter/Setter),可以使用 inline 关键字建议编译器将其替换为内联代码,从而节省函数调用的开销。但需注意,如果函数体包含复杂的循环或分支,编译器通常会忽略 inline 建议。
#include <iostream>
using namespace std;
// 声明为内联函数
inline int maxVal(int a, int b, int c) {
a = b > a ? b : a;
a = c > a ? c : a;
return a;
}
int main() {
int m = maxVal(10, 20, 40);
cout << "max= " << m << endl;
return 0;
}
以上就是C++类与对象机制及成员函数使用的详细内容,更多关于C++ 面向对象 封装的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









