C++封装、构造函数、析构函数

封装、构造函数、析构函数

1 封装
在这里插入图片描述
①具体一点,封装是将数据和行为结合在一个包中,对对象的使用者隐藏数据的实现方式。

②实现封装的关键:不能让类中的方法直接访问其他类的内部数据,只能通过公开行为方法来间接访问。

其实在上一节中已经提到过封装的概念了。

将数据成员和成员函数包装进类中,加上具体实现的隐藏,共同被称作封装,其结果是一个同时带有特征和行为的数据类型。

信息隐藏是OOP最重要的功能之一,也是使用访问修饰符的原因。

信息隐藏的原因包括:

①对模块的人和实现细节所作的更改不会影响使用该模块的代码

②防止用户意外修改数据

③使模块易于使用和维护

2 构造函数

1、对象初始化

所有的变量都有一个初始状态,对象的初始值由构造函数决定。

建立对象的同时,自动会调用构造函数。

2、构造函数的基本语法

构造函数和类名相同,没有返回值

3、构造函数的初始化列表

一般使用初始化列表对数据成员进行初始化

4、构造函数的重载

一个类可以有多个构造函数

5、默认构造函数

不需要参数可以构造对象的函数叫做默认构造函数

首先建立一个类

class car

{

public:

//属性初始化

car()

{

cout<<”car constructor”<<endl;

price=1;

weight=1;

sudu=0;

}

private:

int price;

int weight;

int sudu;

};

int main()

{

car Car;

cout<<Car.price<<" “<<Car.weight<<” "<<Car.sudu<<endl;

return 0;

}

如下 在用car类 定义一个对象Car时,会自动调用构造函数car()。

运行结:

car constructor

1 1 0

3 析构函数

1、对象的销毁

在程序运行中,所有变量都要在合适的时机将对象销毁,否则会影响程序性能

2、析构函数的基本概念

析构函数负责回收对象资源

3、析构函数的语法

析构函数和类名相同,在前面加上"~"

构造函数是定义一个对象的时候调用的,那么析构函数在什么时候调用的呢?

首先建立一个类

class car

{

public:

//属性初始化

car()

{

cout<<" car constructor"<<endl;

}

~car()

{

cout<<" car destructor"<<endl;

}

private:

int price;

int weight;

int sudu;

};

当主函数为:

int main()

{

car Car;

cout<<“main will be end”<<endl;

return 0;

}

运行结果:

car constructor

main will be end

car destructor

当主函数为:

int main()

{

{

car Car;

}

cout<<“main will be end”<<endl;

return 0;

}

运行结果:

car constructor

当主函数为:

int main()

{

car Car;

cout<<“main will be end”<<endl;

return 0;

}

运行结果:

car constructor

car destructor

main will be end

仔细观察为什么结果不同,可以初步对比出析构函数的调用时机。对象的生命周期是从对它定义的时候开始,到它遇到第一个花括号结束,当对象的生命周期结束时,将调用析构函数。

注意:

①如果一个类没有专门定义构造函数,那么C++就仅仅创建对象而不做任何初始化

②如果类没有自定义析构函数,则编译器提供一个默认的析构函数

上期每次一练答案:

#include <stdio.h>

#include <string.h>

int main( )

{

char a[10] = “abc” ,b[10] = “012”,c[10] = “xyz”;

strcpy( a+1,b+2);

puts( strcat( a,c+1));

return 0;

}

输出结果为:a2yz

解析:

C语言标准库函数strcpy,把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间。。

从a[1]的地址开始,把b[2]开始的字符复制到a[1],当然字符串结束标志也复制过去了。此时a[10] = “a2\0”;

strcat( a,c+1);这个就简单多了。把c[1]开始的字符串接过去到a的屁股后面。。a[10]=“a2yz\0”;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章