类,构造函数,析构函数

目录

学生类

 构造函数

析构函数

构造函数调用时机

析构函数调用时机


类也是一种复杂的自定义数据类型,它将不同的数据类型和数据操作封装在一起.和结构体不同的是结构体只是封装数据,没有封装数据操作.

类中的数据也叫数据成员,数据的操作也叫成员函数.

class是定义类的关键字,类的成员在权限上分为,公有(public),私有(private)和保护(protected)三种

C++中类的成员默认是private属性(私有的),外部不能随意访问.结构体中可以认为是public属性(公有的),外部可以随意访问.

封装:对内数据开放,对外提供接口.

class 类名

{

成员权限:

        数据成员或成员函数说明

成员权限:

        数据成员或成员函数说明      

}

学生类

#define _CRT_SECURE_NO_WARNINGS#include 
#include 	using namespace std;class Student	//学生类
{
public:	//公有成员,类外可以随意访问//说话void studentSpeak()const{cout << "我是" << m_name << ",今年" << m_age << ",这次考试得分" << m_score << endl;}//改变分数void studentSetScore(int score)	//对外提供接口,可以修改年龄{m_score = score;}//初始化void studentInit(const char* name, int age, int score){m_name = new char[64];strcpy(m_name, name);m_age = age;m_score = score;}//释放空间void studentDelete(){delete[]m_name;}
private:	//私有成员,类内不能随意访问(也就是在类外不能随意更改我们的数据)char* m_name;int m_age;int m_score;
};int main()
{//定义一个类(student)对象(s)数组Student s[3];s[0].studentInit("小明", 18, 70);//s[0].m_socre = 100;	//error 私有数据成员类外不能随意访问,固不能修改cout << "改变分数之前" << endl;s[0].studentSpeak();s[0].studentSetScore(80);cout << "改变分数之后" << endl;s[0].studentSpeak();cout << endl;s[1].studentInit("小华", 19, 80);cout << "改变分数之前" << endl;s[1].studentSpeak();s[1].studentSetScore(90);cout << "改变分数之后" << endl;s[1].studentSpeak();cout << endl;s[2].studentInit("小绿", 20, 90);cout << "改变分数之前" << endl;s[2].studentSpeak();s[2].studentSetScore(100);cout << "改变分数之后" << endl;s[2].studentSpeak();cout << endl;for (int i = 0; i < 3; i++){s[i].studentDelete();}return 0;
}

 构造函数

        作用:初始化

        与类名相同,无返回值,出现新对象的时候自动调用

        它可以有参数,可以发生重载,也可以有默认参数

构造函数如果不写,编译器会提供一个默认构造函数.

其实我们上面学生类的studentInit等于构造函数,构造函数的目的也是初始化.只是名字和调用的方式不同而已.

如果我们提供了构造函数,编译器不会为我们提供默认构造函数,如果我们想要对象(s)有默认值,我们需要对其提供默认构造函数(也就是无参构造函数)

#define _CRT_SECURE_NO_WARNINGS#include 
#include 	using namespace std;class Student	//学生类
{
public:	//公有成员,类外可以随意访问//构造函数Student(const char* name, int age, int score){m_name = new char[64];strcpy(m_name, name);m_age = age;m_score = score;}//默认构造函数Student(){m_name = nullptr;m_age = 0;m_score = 0;}//说话void studentSpeak()const{cout << "我是" << m_name << ",今年" << m_age << ",这次考试得分" << m_score << endl;}//改变分数void studentSetScore(int score)	//对外提供接口,可以修改年龄{m_score = score;}//释放空间void studentDelete(){delete[]m_name;}
private:	//私有成员,类内不能随意访问(也就是在类外不能随意更改我们的数据)char* m_name;int m_age;int m_score;
};int main()
{//定义一个类(student)对象(s)数组Student s[3];s[0] = { "小明", 18, 70 };//s[0].m_socre = 100;	//error 私有数据成员类外不能随意访问,固不能修改cout << "改变分数之前" << endl;s[0].studentSpeak();s[0].studentSetScore(80);cout << "改变分数之后" << endl;s[0].studentSpeak();cout << endl;s[1] = { "小华", 19, 80 };cout << "改变分数之前" << endl;s[1].studentSpeak();s[1].studentSetScore(90);cout << "改变分数之后" << endl;s[1].studentSpeak();cout << endl;s[2] = { "小绿", 20, 90 };cout << "改变分数之前" << endl;s[2].studentSpeak();s[2].studentSetScore(100);cout << "改变分数之后" << endl;s[2].studentSpeak();cout << endl;for (int i = 0; i < 3; i++){s[i].studentDelete();}return 0;
}

运行结果和上面是一样的

析构函数

        作用:释放内存操作

        ~类名,无返回值,无参数

        对象消失的时候自动调用

其实我们也有就是studentDelete等于构造函数,析构函数的目的也是释放空间,调用方式不同而已.

#define _CRT_SECURE_NO_WARNINGS#include 
#include 	using namespace std;class Student	//学生类
{
public:	//公有成员,类外可以随意访问//默认构造函数Student(){cout << "默认构造函数" << endl;m_name = new char[2];strcpy(m_name, "\0");m_age = 0;m_score = 0;}//构造函数Student(const char* name, int age, int score){cout << "构造函数" << endl;m_name = new char[64];strcpy(m_name, name);m_age = age;m_score = score;}//析构函数~Student(){cout << "析构函数" << endl;//这样释放空间可以防止重复释放if (m_name != nullptr){delete[]m_name;m_name = nullptr;}}//说话void studentSpeak()const{cout << "我是" << m_name << ",今年" << m_age << ",这次考试得分" << m_score << endl;}//改变分数void studentSetScore(int score)	//对外提供接口,可以修改年龄{m_score = score;}private:	//私有成员,类内不能随意访问(也就是在类外不能随意更改我们的数据)char* m_name;int m_age;int m_score;
};int main()
{//定义一个类(student)对象(s)数组Student s[3] = {{ "小明", 18, 70 },{ "小华", 19, 80 },{ "小绿", 20, 90 }};//s[0].m_socre = 100;	//error 私有数据成员类外不能随意访问,固不能修改cout << "改变分数之前" << endl;s[0].studentSpeak();s[0].studentSetScore(80);cout << "改变分数之后" << endl;s[0].studentSpeak();cout << endl;cout << "改变分数之前" << endl;s[1].studentSpeak();s[1].studentSetScore(90);cout << "改变分数之后" << endl;s[1].studentSpeak();cout << endl;cout << "改变分数之前" << endl;s[2].studentSpeak();s[2].studentSetScore(100);cout << "改变分数之后" << endl;s[2].studentSpeak();cout << endl;return 0;
}

 

构造函数调用时机

        定义对象

        定义对象时用另一个对象对齐初始化

        作为函数参数按值传递时

        作为局部变量按值返回时

        两个已存在的对象一个值赋值给另一个

析构函数调用时机

        这个说的太好了(图片来源与网络),看起来好像是一本书.如果有知道这本书的麻烦告诉我一下,很有兴趣看看.

不得吐槽一下VS,他真的帮我们做了太多事,但也真的限定了挺多的.至于是好是坏看个人吧.不过只针对C++友好度而言.VS毫无疑问是大哥.

        


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部