在网站制作完成后网站建设,辽宁建设工程信息网新点,精品网络小说,山西省住房城乡建设厅网站首页说起默认成员函数#xff0c;每一个C程序员都不会陌生#xff0c;因为默认成员函数就如同是一栋大厦的地基。我们常说“基础不牢#xff0c;地动山摇”#xff0c;在这里得到充分的体现。本章介绍两种默认成员函数#xff1a;构造函数和析构函数。 正文开始~~~
构造函数 … 说起默认成员函数每一个C程序员都不会陌生因为默认成员函数就如同是一栋大厦的地基。我们常说“基础不牢地动山摇”在这里得到充分的体现。本章介绍两种默认成员函数构造函数和析构函数。 正文开始~~~
构造函数 相信每一个C程序员都是从C语言走过来的而C作为比C更先进的语言肯定要修改一下C语言不好的地方。比如用C语言实现栈、队列等数据结构的时候每次都需要先对其进行初始化但是我们程序员都是人不是机器肯定会有忘记的时候忘记初始化的后果不用我多说。所以我们C的祖师爷本贾尼博士(Bjarne Stroustrup)也是深受其扰然后就提出了构造函数的概念在对象被创建时构造函数被自动执行。
构造函数的特性 具体每条特性我会根据代码一一介绍 函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。 //一个日期类
class Date
{
public://构造函数名与类名相同并且无返回值Date(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout _year _ _month _ _day endl;}
private:int _year;int _month;int _day;
};int main()
{//对象实例化自动调用构造函数Date d1(2024,4,11);d1.Print();//结果为2024_4_11 注VS2022测试return 0;
} 4.构造函数可以重载。 //上面代码的构造函数还可以写成这种形式
Date(int year 1, int month 1, int day 1)
{_year year;_month month;_day day;
} 5.如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成。 //还是上面的代码但是我们没有主动显示的写构造函数
class Date
{
public://下面的两行代码就相当于编译器自动生成的构造函数//Date()//{}void Print(){cout _year _ _month _ _day endl;}
private:int _year;int _month;int _day;
};int main()
{//对象实例化自动调用构造函数Date d1;d1.Print();//结果为随机值_随机值_随机值 注VS2022测试return 0;
} 6.C把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型如int/char...自定义类型就是我们使用class/struct/union等自己定义的类型。编译器生成的默认成员函数对于内置类型C没有规定要不要处理具体看编译器而对于自定义类型会默认调用自定义类型的默认成员函数。 //在上述代码的基础上我们又添加了一个Time类(自定义类型)
class Time
{
public://Time的构造函数因为这是我们主动写的所以编译器不会自动生成Time(){_hour 0;_minute 0;_second 0;}void Print(){cout _hour _ _minute _ _second endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
public:void Print(){cout _year _ _month _ _day endl;}
private:int _year;//内置类型C没有规定要不要处理看编译器int _month;int _day;Time _t;//自定义类型调用自定义类型的默认构造函数
};int main()
{Date d1;d1.Print();//结果为随机值_随机值_随机值 注VS2022测试Time t1;t1.Print();//结果为0_0_0 注VS2022测试return 0;
} 7.无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个。注意无参构造函数、全缺省构造函数、我们没写编译器自动生成的构造函数都可以认为是默认构造函数。 构造函数总结 一般情况下构造函数都需要我们自己显示的去实现只有少数情况下可以让编译器自动生成构造函数 析构函数 与构造函数一样有初始化就会有销毁而析构函数的作用就是完成对象中资源的清理工作所谓的资源清理工作就是malloc了不用freefopen了不用fclose等等后续的工作析构函数会自动调用帮你完成。怎么样是不是爽得很hhhhh
析构函数的特性 具体每条特性我会根据代码一一介绍 1. 析构函数名是在类名前加上字符 ~。 2. 无参数无返回值类型。 3. 一个类只能有一个析构函数。若未显式定义系统会自动生成默认的析构函数。注意析构函数不能重载 4. 对象生命周期结束时C编译系统系统自动调用析构函数。 typedef int DataType;
class Stack
{
public://自己写的构造函数Stack(size_t capacity 4){_array (DataType*)malloc(sizeof(DataType) * capacity);_capacity capacity;_size 0;}// 析构函数无参数无返回值函数名是在类名前面加上~~Stack(){cout ~Stack() endl;if (_array){free(_array);_array NULL;_capacity 0;_size 0;}}
private:DataType* _array;int _capacity;int _size;
};int main()
{//对象实例化Stack st;//结果为~Stack()。从结果我们可以看出自动调用了析构函数return 0;
} 5. 编译器自动生成的默认析构函数对自定类型成员调用它的析构函数。 class Time
{
public:~Time(){cout ~Time() endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:int _year; // 基本类型(内置类型)int _month;int _day;Time _t; // 自定义类型//我们没显示写析构函数编译器自动生成析构函数//然后去调用自定义类型的析构函数这里跟构造函数是一样的
};
int main()
{Date d;//结果为~Time()return 0;
} 6. 如果类中没有申请资源时析构函数可以不写直接使用编译器生成的默认析构函数比如Date类有资源申请时一定要写否则会造成资源泄漏比如Stack类。 析构函数总结 1. 有资源需要显示清理就需要写析构函数如Stack。 2. 有两种场景不需要显示写析构函数默认生成就可以。 a.没有资源需要清理如Date。 b.内置类型成员没有资源需要清理如MyQueue。