写一篇基础文章
讲一下类与对象这个东西,比较深的概念就不讲了。 类顾名思义 也就是某种具有相同特点的东西的集合,比如车类身上含有轮胎,座位,发动机等,这些东西的集合构成了一个车类,在这里我以学生作为开端,后面会讲解到继承,多态等先基础开始。
首先!看图!
private是完全私有的,只有自己可以访问,派生类和外部都不可以访问
protected是受保护的,只有派生类可以访问,外部不能访问
public权限是最大的,可以内部调用,实例调用等。
这个详细就不说了,可以去参考课本讲解 大概都差不多。
然后我们来定义类!
首先 类的定义 一定是这样的! class 名字{ }; 这样的结构!
后面那个分号别漏了!一般定义类的时候都会带有分号! 但是还有一个重点 那就是名字首字母一定是大写!大写!大写!记住了 一定是大写!
来看代码片段!
思路!:
1.类是包含有成员变量跟成员函数的集合,所以看到了有成员变量跟成员函数
2.有人会说你怎么都是私有成员变量!当然你也可以别的属性,public也行,protect也行,在这里我统一用private!
3.成员函数也分有public,private,protect,看你想实现什么功能而定!在这里我只用public!
4.定义了类下一步想着的一定是初始化!一定是初始化!初始化的操作有一个专业名词!叫构造函数!
5.构造函数有一个特点! 那就是一定跟类同名!一定要记住!!!!
构造函数分为带参数构造跟不带参数构造!,无参构造就算你自己不写!系统也会默认给你来一个无参构造! 当然自己写比较好,带参数构造会比较方便,记住! 带参数构造一定要对应好你的参数是什么类型! 比如 int,float等! 一定要对应!
6.还有一点!析构函数很重要! 析构函数很容易记 就是无参构造函数前面加个波浪线就行了 结构: ~类同名(); 析构函数就是释放内存用的!
#include<iostream>
#include<string>
using namespace std;
class Student
{
private:
int age;//年龄 成员变量
int height;//身高 成员变量
string sex;//性别 成员变量
//如果版本比较低的vs编译软件要包含头文件string
//2019版的话以及以后的版本都不可不用包含string头文件
string numb;//学号 成员变量
public:
Student();//无参构造函数!
Student(int a, int h, string s, string n);//带参构造函数
~Student();//析构函数
void Print_Message();//输出信息! 成员函数
void StudentShow();//学生的能力!成员函数
};
我为了我的类看起来不那么拖拉!就是看起来简洁点!我选择类外构造!
类外定义的概念讲一下!
- 首先一定要带上类名 类名后面接的是作用域!(::)就是这个符号
也就是 类名::函数名()!
2.要注意! 如果你的成员函数有类型!比如int,void什么的 一定要带上 在类名的前面!
假如我有个void类型的成员函数 那么就是这样:void 类名::函数名(),括号里带参还是不带参取决于你前面怎么定义就怎么来!!
我先把这三个有点相同的一起写!
Student::Student()
{
//无参构造他内部做这种操作
/*age = 0;
height = 0;
sex = {};
numb = {};
this->age = 0;
this->height = 0;
this->numb = {};
this->sex = {};*/
cout << "我是无参构造" << endl;
}
Student::Student(int a, int h, string s, string n)
{
cout << "有参构造初始化!" << endl;
this->age = a; //你也可以age=a; 一样的 this当然是比较好的 看个人!
this->height = h;//你也可以height=h; 如果要了解this就看书这里不详讲!
this->sex = s; //你也可以sex=s;
this->numb = n;//你也可以numb=n;
}
Student::~Student()
{
cout << "调用了析构函数!内存释放!" << endl;
}
来!行为函数!看一下看 也没什么特别的就有啥输出啥唯独是作用域
好好看作用域! 看透了!
返回类型+类名+作用域+函数名()
void Student::StudentShow()
{
cout << "学生在学习!在写作业!" << endl;//写着玩的看自己想怎么写就怎么写!
}
void Student::Print_Message()
{
cout << "这个学生的年龄:" << this->age << endl;
//或者可以直接cout<<age 下面也可以这样!;
cout << "这个学生的身高:" << this->height << endl;
cout << "这个学生的性别:" << this->sex << endl;
cout << "这个学生的学号:" << this->numb << endl;
cout << "==============================================" << endl;
//这样看着挺多cout的对吧 你也可以合并一起写但是太长了
//我就这样写了!方便看吧
}
好 接下来我们来创建对象!
无参的对象:类名+名;
有参的对象:类名+名(把前面定义的参数类型传进去!);
析构函数一定要放到最后 因为是释放内存的 一定要注意!
如果无参构造出来的对象想要赋值!一定要定义set()跟get()函数这里就不说了!
对象一旦创建了,就是默认性的调用构造函数
有几个对象就默认的调用了几次
比如代码中Student s1; 它一旦创建了就会直接s1.Student() 当然里面是不能这么写的 知道一下原理就行!
int main()
{
Student s1;//这就是创建对象 但这是无参的构造!
Student s2;//再来一个无参的
cout << "==============================================" << endl;
Student s3(18, 170, "男", "20124026"); //这就是创建对象 就这么简单 但这是有参的!
Student s4(17, 165, "女", "20124025");//再来一个对象!有参的
cout << "==============================================" << endl;
//这个对象要执行的操作!我们用点 点出来
cout << "学生的行为" << endl;
s1.StudentShow();//对象做的事!
s2.StudentShow();
s3.StudentShow();
s4.StudentShow();
cout << "==============================================" << endl;
cout << "输出学生的信息" << endl;
s1.Print_Message();//输出有乱码是因为输出的是地址,string类似数组
s2.Print_Message();
s3.Print_Message();
s4.Print_Message();
cout << "==============================================" << endl;
cout << "析构函数" << endl;
//记住 析构一定放在最后面
s1.~Student();
s2.~Student();
s3.~Student();
s4.~Student();
return 0;
}
来 我们直接上主要测试代码
#include<iostream>
#include<string>
using namespace std;
class Student
{
private:
int age;//年龄
int height;//身高
string sex;//性别 //如果版本比较低的vs编译软件要包含头文件string
//2019版的话以及以后的版本都不可不用包含string头文件
string numb;//学号
public:
Student();//无参构造函数!
Student(int a, int h, string s, string n);//带参构造函数
~Student();//析构函数
void Print_Message();//输出信息!
void StudentShow();//学生的能力!
};
Student::Student()
{
/*age = 0;
height = 0;
sex = {};
numb = {};
this->age = 0;
this->height = 0;
this->numb = {};
this->sex = {};*/
cout << "我是无参构造" << endl;
}
Student::Student(int a, int h, string s, string n)
{
cout << "有参构造初始化!" << endl;
this->age = a; //你也可以age=a; 一样的 this当然是比较好的 看个人!
this->height = h;//你也可以height=h; 如果要了解this就看书这里不详讲!
this->sex = s; //你也可以sex=s;
this->numb = n;//你也可以numb=n;
}
Student::~Student()
{
cout << "调用了析构函数!内存释放!" << endl;
}
void Student::StudentShow()
{
cout << "学生在学习!在写作业!" << endl;//写着玩的看自己想怎么写就怎么写!
}
void Student::Print_Message()
{
cout << "这个学生的年龄:" << this->age << endl;//或者可以直接cout<<age 下面也可以这样!;
cout << "这个学生的身高:" << this->height << endl;
cout << "这个学生的性别:" << this->sex << endl;
cout << "这个学生的学号:" << this->numb << endl;
cout << "==============================================" << endl;
//这样看着挺多cout的对吧 你也可以合并一起写但是太长了
//我就这样写了!方便看吧
}
int main()
{
Student s1;//这就是创建对象 但这是无参的构造!
Student s2;//再来一个无参的
cout << "==============================================" << endl;
Student s3(18, 170, "男", "20124026"); //这就是创建对象 就这么简单 但这是有参的!
Student s4(17, 165, "女", "20124025");//再来一个对象!有参的
//这个对象要执行的操作!我们用点 点出来
cout << "==============================================" << endl;
cout << "学生的行为" << endl;
s1.StudentShow();//对象做的事!
s2.StudentShow();
s3.StudentShow();
s4.StudentShow();
cout << "==============================================" << endl;
cout << "输出学生的信息" << endl;
s1.Print_Message();
s2.Print_Message();
s3.Print_Message();
s4.Print_Message();
cout << "==============================================" << endl;
cout << "析构函数" << endl;
//记住 析构一定放在最后面
s1.~Student();
s2.~Student();
s3.~Student();
s4.~Student();
return 0;
}