目录
9.1 类和对象的基本概念
9.1.1 类的封装性
类是一种用户自定义的数据类型,它定义了一组数据成员和成员函数。类可以看作是一个模板或者蓝图,用于创建对象。类将具有共性的数据和方法封装在一起,加以权限区分,用户只能通过公共方法 访问私有数据。
这里我的另外一个理解是这样的:类就像是一个学生类别、每个具体的张三、李四学生就是一个对象,对象就有不同的属性,不同的姓名、身高、体重、性别、年龄这些特征,比如张三会武术、李四会跳舞、王五会吃土等等,你的类就是相当于一个空白的模板,把这些属性汇合到一起以后,同过这个类名称来创建张三、李四对象,每一个对象都可以拥有不一样的身高体重等等,这里只是举个例子,实际上类和对象的作用比上面说的要大很多。并且类中的不同函数、方法的权限不一,更加的多元化,满足不同需求。
对象则是类的实例化结果,它是类的具体实体,具有类定义中定义的数据成员和行为(成员函数)。
我们编写程序的目的是为了解决现实中的问题,而这些问题的构成都是由各种事物组成,我们在计算机中要解决这种问题,首先要做就是要将这个问题的参与者:事和物抽象到计算机程序中,也就是用程序语言表示现实的事物。那么现在问题是如何用程序语言来表示现实事物?现实世界的事物所具有的共性就是每个事物都具有自身的属性,一些自身具有的行为,所以如果我们能把事物的属性和行为表示出来,那么就可以抽象出来这个事物。
类的权限分为: private (私有)、protected (保护) 、public (公有) 3种权限。
在类的外部,只有public修饰的成员才能被访问,在没有涉及继承与派生时,private和protected是同等级的,外部不允许访问。用户在类的外部可以通过public的方法间接访问private和protected数据
9.1.2 定义类的步骤和方法
定义类的关键字:class
设计一个类步骤: 思考该类有哪些数据成员 操作这些数据的成员函数 数据一般默认都是设计成私有, 成员函数为公有,通过成员函数操作数据,来实现对类和对象的一些操作。
注意,私有、保护成员变量不能直接在类的外部进行访问
完整代码:
#include <iostream>
using namespace std;
class Data{
//类中默认为私有
private:
int a; //私有成员变量,不用给类中成员初始化
protected:
int b;//受保护的成员变量
public:
int c;//公有的成员变量
//在类的内部,不分权限之分
void printData(void){
cout << a << " " << b << " " << c <<endl;
}
};
int main()
{
//用类实例化一个对象
Data dataer;
//类外部(“{}”介于花括号之间的属于类的内部)不能直接访问私有、受保护的成员变量
// cout << dataer.a <<endl;
// cout << dataer.b <<endl;
cout << dataer.c <<endl;
//类中的成员函数,需要通过对象名来调用
dataer.printData();
return 0;
}
9.1.3 设计一个学生类 Student
题目:学生信息管理系统
设计一个学生类 Student
,包含以下成员:
数据成员:
- 学生姓名(name)
- 学生学号(id)
成员函数:
- 构造函数:带有学号和姓名的参数列表,用于初始化学生对象的数据成员。
void setInfo(const std::string& n, const std::string& i)
:设置学生的姓名和学号。std::string getName()
:返回学生的姓名。std::string getId()
:返回学生的学号。
根据上述要求,设计并实现 Student
类,然后编写一个测试程序,在测试程序中创建多个学生对象,并调用相应的成员函数来设置和获取学生的姓名和学号。
完整代码:
#include <iostream>
#include <string>
class Student {
private:
std::string name; // 学生姓名
std::string id; // 学生学号
public:
// 构造函数,用于初始化学生对象的数据成员
Student(const std::string& n, const std::string& i) {
name = n;
id = i;
}
// 设置学生的姓名和学号
void setInfo(const std::string& n, const std::string& i) {
name = n;
id = i;
}
// 返回学生的姓名
std::string getName() {
return name;
}
// 返回学生的学号
std::string getId() {
return id;
}
};
void test02(){
// 创建两个学生对象,分别设置姓名和学号
Student student1("Alice", "12345");
Student student2("Bob", "67890");
// 输出学生1的姓名和学号
std::cout << "Student 1: " << student1.getName() << " (" << student1.getId() << ")" << std::endl;
// 输出学生2的姓名和学号
std::cout << "Student 2: " << student2.getName() << " (" << student2.getId() << ")" << std::endl;
// 更新学生1的姓名和学号
student1.setInfo("Eve", "54321");
// 输出更新后的学生1的姓名和学号
std::cout << "Student 1 (updated): " << student1.getName() << " (" << student1.getId() << ")" << std::endl;
}
引用千峰教育C++基础班笔记案例和内容,并作了补充和修改
案例:
请设计一个Person类,Person类具有name和age属性,提供初始化函数(nit),并提供对name和age的读写函数(set,get),但必须确保age的赋值在有效范围内(0-100),超出有效范围,则拒绝赋值,并提供方法输出姓名和年龄。
说明:
代码:(原出处中对代码的标准使用是基于C++98版本的,所以我这里此后全部基于C++11以及11以上的标准进行改写,说明,同时能直接掌握c++11标准用法)
class Person
{
private:
const char *m_Name;//私有的 c++11标准使用 const char *修饰字符串
int m_Age;//成员变量
public:
//初始化函数
void personInit(const char *name,int age){
// strcpy(m_Name,name);
m_Name = name;
if(age > 0 && age <= 100){
m_Age = age;
}else{
cout << "输入的年龄:"<<m_Age<<"不合法"<<endl;
}
}
//设置m_Age年龄
void setAge(int age){
if(age > 0 && age <= 100){
m_Age = age;
}else{
cout << "输入的年龄:"<<m_Age<<"不合法"<<endl;
}
}
int getAge(void){
return m_Age;
}
//设置m_Name
void setName(const char *name){
//strcpy_s(m_Name,name);
m_Name = name;
}
//得到m_Name
const char *getName(void){
return m_Name;
}
//显示年龄和姓名
void showPerson(){
cout<<"姓名:"<<m_Name<<" 年龄:"<<m_Age;
}
};
void test03(){
Person spike;
spike.personInit("name",18);
spike.setName("肉丝");
spike.setAge(16);
cout<<spike.getName()<<""<<spike.getAge()<<endl;
spike.showPerson();
}
Result: