类的知识点
类的概述:类是 C++ 的核心特性,在C++中,除了已有的数据类型(整型,字符型)外,还可以自定义数据类型,这种类型通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法(数据类)和用于处理数据(操作类)的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。
类的定义:类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。例如,我们使用关键字 class 定义 Box 数据类型,如下所示:
class Box { public://公有成员 在类外可以访问 double length; // 盒子的长度 double breadth; // 盒子的宽度 double height; // 盒子的高度 };
注:
① 如果类的定义和主函数在同一个源文件里,那么就会可能遇到这样的问题:在类定义之 前,主函数使用了这个类。这将会导致错误的发生,因为主函数还没有意识到这个类的存在。 所以必须在主函数之前声明这个类的存在。
② 还可以在头文件中定义类,然后在.Cpp源文件中包含这个头文件,由于包含头文件在主函数之前,所以不用在主函数中声明这个类。
Student.h //头文件 class Student //学生类的定义 { …… }; main.cpp //文件 #include "Student.h" //要注意这里必须用双引号,而不能用尖括号 int main() { …… }
创建对象:对象是根据类来创建的,声明类的对象,就像声明基本类型的变量一样。
Box B; // 声明对象B,类型为Box型
对象的引用:
声明一个对象的引用方法是: 类名 &对象名 a=对象名 b;
对对象 a 的访问和操作就如同对对象 b 的访问和操作一样,对象 a 只是对象 b的一个“绰号”。
string A; //声明一个字符串对象 string &B=A; //声明一个引用 B.append("ABC"); //效果与 A.append("ABC")相同
对象指针:所谓对象指针,就是指向对象的指针
string A; //声明一个字符串对象 string *B=&A; //声明一个对象指针 B->append("ABC"); //效果与 A.append("ABC")相同
【箭头操作符->可以访问该指针所指向的对象的成员数据或成员函数】
访问数据成员:
在访问数据成员时,可以用访问运算符 . 操作 ,私有的【Private】成员和受保护的【 Protected】成员不能使用直接成员访问运算符 . 来直接访问。
#include <iostream> using namespace std; class Box //定义Box类 { public://公有成员 double length; // 长度 double breadth; // 宽度 double height; // 高度 }; int main( ) { Box Box1; // 声明 Box1 对象,类型为 Box double volume = 0.0; // 用于存储体积 // box 1 详述 Box1.height = 10.0; Box1.length = 10.0; Box1.breadth = 10.0; // box 1 的体积 volume = Box1.height * Box1.length * Box1.breadth; cout << "Box1 的体积:" << volume <<endl; return 0; }
注:同一个类的成员数据(或成员函数)在其成员函数中可以直接使用。在这个类外使用一个对象的公有成员数据时,要写作“对象名.成员数据”,但是在成员函数中不需要也不能那样写。
常成员函数:
在成员函数后加上const,使用常成员函数,就保证了成员数据的安全。在此函数中任何修改成员数据的语句将被编译器拒之门外。
int readNo() const; //读取学号函数 只能读取不能修改数据
成员函数的重载:
和普通函数类似,在一个类中也可以有成员函数的重载,但是任意两个同名函数参数表中的参数个数、各参数的数据类型和顺序不能完全一样。
void set(int No,string Name); //设置学号姓名 void set(); // 重置学号姓名
构造函数:
构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化。在 C++中,规定与类同名的成员函数就是构造函数。构造函数应该是一个公有的成员函数,并且构造函数没有返回值类型。
#include<bits/stdc++.h> using namespace std; class Student//学生数据类 { private: string name;//姓名 int no;//学号 int score[3];//语数外成绩 float average;//平均成绩 int order;//排名 public: Student(int id,string na,int x,int y,int z):name(na),no(id){//含参构造函数 score[0]=x,score[1]=y,score[2]=z; order=1,average=(score[0]+score[1]+score[2])/3; } Student(){//无参构造函数 score[0]=score[1]=score[2]=0; order=1,average=0; } };