类和对象的关系
- 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。
- 类,是创建对象的模板,一个类可以创建多个相同的对象;对象,是类的实例,是按照类的规则创建的。
类访问修饰符
- C++的类访问修饰符有三个:
public、private、protected
,在类主体的内部通过对各个区域标记类访问修饰符来对类成员的访问进行限制。 - 一个类可以有多个public、private或protected标记区域,每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的
- 成员和类的默认访问修饰符是private
- protected表示保护成员,该成员只能被该类的成员函数或者派生类的成员函数访问;public表示公有成员,在类的外部是可访问的;private表示私有成员,在类的外部是不可访问的,甚至是不可查看的,只有类和友元函数可以访问私有成员。
友元函数:友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数
构造函数
- 由类得到对象需要构造函数,系统会自动调用相应的构造函数;对象使用完之后需要释放占有的资源,系统就会自动调用相应的析构函数。
- 构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能够识别他们并把他们作为构造函数处理
- 构造函数不需要用户调用,也不能被用户调用。
- 构造函数可以在类中定义,也可以在类外定义。
- 构造函数不具有任何类型,也不返回任何值
- 构造函数的功能是由用户定义的,用户根据初始化要求设计函数体和函数参数,但是一般不提倡在构造函数中加入与初始化无关的内容,以保持程序的清晰
- 如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作
- 注意: 参数初始化顺序与初始化表列出的变量的顺序无关,它只与成员变量在类中的声明的顺序有关
- 调用构造函数时不必给出实参的构造函数称为默认构造函数,一个类只能有一个默认构造函数。
析构函数
- 析构函数也是一种特殊的成员函数,没有返回值,当对象的生命期结束时,会自动执行析构函数。
- 析构函数的名字是在类名前面加一个"~"符号
- 一般情况下,调用析构函数的次序正好与调用构造函数的次序相反,最先被调用的构造函数,其对应的析构函数最后被调用,而最后被调用的构造函数其对应的析构函数最先被调用(相当于在一个栈,先进后出)
- 注意:并不是所有情况都按上述次序调用的,对象的作用域和存储类别也会影响他们的调用次序,这里不再赘述
样例
cpp
#include<iostream>
#include<string>
using namespace std;
class Student ///声明学生类
{
public: ///定义私有成员变量
string sname;
int sage;
string sno;
public:
///定义构造函数,外部可访问
Student(string name,int age,string no){
sname=name;
sage=age;
sno=no;
cout<<"调用构造函数"<<endl;
}
///定义析构函数
~Student(){
cout<<"调用析构函数"<<endl;
}
///声明成员函数
void Ater_Sno(string no);
void Show(){
cout<<"学生个人信息:"<<endl;
cout<<"姓名:"<<sname<<endl;
cout<<"年纪:"<<sage<<endl;
cout<<"学号:"<<sno<<endl;
}
};
///在类外部定义成员函数(一定要先声明)
void Student::Ater_Sno(string no){
sno=no;
}
int main(){
Student stu1("张三",12,"001");
stu1.Show();
stu1.Ater_Sno("003");
stu1.Show();
}
运行结果:
bash
调用构造函数
学生个人信息:
姓名:张三
年纪:12
学号:001
学生个人信息:
姓名:张三
年纪:12
学号:003
调用析构函数