网站推广方式措施,青岛seo搜索优化,黑龙江 俄语网站制作,零食天堂 专做零食推荐的网站前言#xff1a;C初阶系列#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家#xff0c;争取让所有人都可以听懂#xff0c;C初阶系列会持续更新#xff0c;上学期间将不定时更新#xff0c;但总会更的 目录
一、构造函数
1.1为什么要有构造函数C初阶系列每一期博主都会使用简单朴素的语言将对应的知识分享给大家争取让所有人都可以听懂C初阶系列会持续更新上学期间将不定时更新但总会更的 目录
一、构造函数
1.1为什么要有构造函数
1.2构造函数的特性
1.3使用构造函数
1.4内置类型和自定义类型在构造方面的细节
二、析构函数
1.为什么要有析构函数
2.析构函数的特性
3.使用析构函数
三、下期预告 一、构造函数
1.1为什么要有构造函数 在C语言的学习中我们创建一个结构体变量之后所做的第一件事就是初始化结构体变量我们往往会为此写上一个初始化函数Init被初始化的结构体名字。就拿顺序表来说我们初始化顺序表就会写上一个InitSeqlist之类的函数。但是我们写了有时也会忘记使用它哈哈是不是蚌埠住了但这就是我们经常会犯的错误这往往会造成我们的程序与预期不符举个例子我们在初始化顺序表的时候应该要将顺序表首元素的指针置空或开空间但我们若是忘记置空或者忘记开空间就会导致我们访问到野指针会造成不可预料的后果。 因此在C中就诞生了一个超级好用的东西它就是构造函数它的作用也是很简单粗暴那就是在你创建了一个对应的类(结构体)的时候编译器会根据你书写的构造函数对你创建的类进行初始化。妈妈再也不用当心我忘记初始化类了~ 1.2构造函数的特性 1. 无返回值。 2.函数名与类名相同。 3. 对象实例化时编译器自动调用对应的构造函数。 4. 构造函数可以重载。 先来讲一下第一点无返回值这里的无返回值是包括void也就是连void都不用直接写构造函数名就行了这时候我们就会接触到第二点函数名与类名相同比方说我们要创建一个关于日期的类我给这个类取名为Date那么我的构造函数也得写成类。 第三点也就是之前我们强调的一点这里就不再赘述。第四点则代表了构造函数的可塑性它是可以重载的那么也就代表着它能够更加灵活地根据我们的需求去构造。对于重载不是很理解的小伙伴可以去看看博主写的这篇文章。C初阶 入门(2)-CSDN博客 1.3使用构造函数 我们拿关于日期的类举例子年月日基本变量创建一下再写一个构造函数和打印函数但需要注意的一点就是构造函数的创建必须要有默认构造函数否则在你不传变量的时候编译器没法对其进行简单地初始化编译器就会报下图所示错误。 什么是默认构造函数?在我看来一共有三种
1.在构造函数中写入缺省值实现全缺省这样就可以实现创建无参数变量依然可以初始化变量 2.使用重载的方式来缺省 3.在声明的同时进行初始化
值得一提的是如果你已经写了构造函数那么编译器就不会采用你写的声明而是会去直接调用你写的构造函数假设你这个构造函数没写完那就会报错。如图 屏蔽掉之后就可以正常的使用声明 总结一下 总的来说默认构造函数就是指不传参也可以调用的函数如全缺省。 博主推荐使用方法1来进行构造函数的书写方法2和方法3写的默认构造函数不是很规矩。 细节 方法1和方法2不可以同时存在否则编译器会出现歧义 值得一提的是方法1和方法2都可以和声明的形式共存这是因为一旦有了构造函数编译器就会忽略声明的初始化而去调用构造函数的内容。 1.4内置类型和自定义类型在构造方面的细节
先来说一下什么是内置类型内置类型就是指语言自带的类型如intdoublefloat......自定义类型就很好理解了就是用户自己定义的类型如class出来的类。但必须要注意的一点则是在C中编译器会对自定义类型调用它的默认构造函数而不对内置类型进行处理。 #includeiostream
#includestdlib.h
using namespace std;
class Stack
{
public:Stack(int capacity10){_capacity capacity;_top 0;_s (int*)malloc(sizeof(int)*_capacity);}
private:int _top;//栈顶元素的位置int _capacity;//容量int* _s;//栈
};
class test
{
public:
private:Stack s1;Stack s2;int a;
};
int main()
{test t1;
}
可以看的出来test我并没有创建属于它的析构函数但它自己就去调用了它的自定义类型成员的默认构造函数使得对应的数据被初始化。有细心的同学可以发现a也被初始化了它不应该是随机值吗我没对它处理啊是的它就应该是随机值但是博主使用的是vs2019这个编译器进行代码的编写它过于先进了直接就帮博主优化了因此看不出现象而在vs2013写这串代码这个变量就应该是随机值。感兴趣的小伙伴可以试一下。
二、析构函数
1.为什么要有析构函数 讲完了构造函数那么我们就来讲一下析构函数既然构造函数是令类创建的时候初始化那么析构函数则是在类的生命域结束的时候将目标清理也就是destroy比方说我们写了一个顺序表它malloc了一大块空间那么我们在程序结束之前就应该将这一大块malloc的空间释放掉避免造成内存泄漏因此我们需要destroy函数来对一些类进行处理。但还是那句话写了但忘记用是常有的事情。因此在C中就诞生了一个函数它就是析构函数它能够令对应的类出了它的生命域便销毁从而保证了安全性。 2.析构函数的特性 1. 析构函数名是在类名前加上字符 ~。 2. 无参数无返回值类型。 3. 一若未显式定义系统会自动生成默认的析构函数。注意析构函数不能重载 4. 对象生命周期结束时C编译系统系统自动调用析构函数。 先来说下第一点第一点很好理解就是在类之前在个波浪号~第二点和构造函数差不多但更严格它连参数都不能有第三点则表示一个类只能有一个析构函数 3.使用析构函数
拿栈来举例
#includeiostream
#includestdlib.h
using namespace std;
class Stack
{
public:Stack(int capacity10){_capacity capacity;_top 0;_s (int*)malloc(sizeof(int) * _capacity);}~Stack(){free(_s);_s nullptr;_top 0;_capacity 0;cout 以下为调用析构函数结果 endl;cout _s endl;cout _capacity endl;cout _top endl;}void print(){cout _s endl;cout _capacity endl;cout _top endl;}
private:int* _s;int _capacity;int _top;
};
int main()
{Stack s1;s1.print();
} 三、下期预告
下回我们来聊一下拷贝构造函数运算符重载QAQ
好了今天的分享到这里就结束了感谢各位友友的来访和阅读祝各位友友们前程似锦O(∩_∩)O