C++类和对象知识点整理三

来源:互联网 发布:深圳2年java工作经验 编辑:程序博客网 时间:2024/06/15 02:45
10、构造函数和析构函数(重点)
a.在C++中,有一种特殊的成员函数,他的名字和类名相同,没有返回值,不需要用户显式调用,用户也不能调用,而是在创建对象时自动执行,这种特殊的成员函数就是构造函数(Constructor)


b.构造函数必须是public属性的,否则创建对象时无法调用,当然,设置为private,protected也不会报错,但是没有意义


c.构造函数没有返回值,函数体中不能有return语句


d.和普通成员函数一样,构造函数是允许重载的。一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数


e.构造函数的调用是强制性的,一旦在类中定义了构造函数,那么创建对象时就一定要调用不调用是错误的,(这里是指定义了一个构造函数,对象就不会自动调用默认的构造函数,而去调用用户自己定义的构造函数,这里就会出现报错的情况,如果用户自己定义了一个构造函数,和系统默认的构造函数一样,在重载系统默认的构造函数,这里就不会报错),如果有多个重载的构造函数,那么创建对象时提供的实参必须和其中一个构造函数匹配,反过来说,创建对象时只有一个构造函数会被调用。


f.如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有实参,也不执行任何操作


11.默认构造函数
一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。


12.参数初始化表
定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添加了一个冒号:,后面紧跟m_name(name),m_age(age),m_score(score)语句,这个语句的意思相当于函数体内部的m_name = name,m_age = age;m_score = score;语句,也是赋值的意思


b.参数初始化表可以用于全部成员变量,也可以只用于部分成员变量


c.参数初始化顺序与初始化表列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。


d.参数初始化表还有一个很重要的作用,那就是初始化const成员变量,初始化const成员变量的唯一方法就是使用参数初始化表


12.析构函数
建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作。
例如:释放分配的内存,关闭打开的文件等,这个函数就是析构函数


析构函数(Destructor)也是一种特殊的成员函数,没有返回,不需要程序员显示调用,(这里程序员也没法显示调用)而是在销毁对象时自动执行。


构造函数的名字和类名相同,而析构函数的名字需要在类名前面加~符号。(函数名是标识符的一种,原则上标识符的命名不允许出现~符号,目的是为了和构造函数加以对比和区分)




析构函数特点:
a.没有返回值,(程序员无法显示调用)
b.析构函数没有参数,无法被重载(和构造函数有差别)
c.如果用户没有自定义,编译器会自动生成一个默认的析构函数




13、new和delete  malloc和free(详解见前面博客)
C++中的new和delete分别用来分配和释放内存,他们和c语言中的malloc()、free()最大的一个不同之处在于:用new分配内存时会调用构造函数,用delete释放内存时会调用析构函数


b.构造函数和析构函数对于类来说时不可或缺的,所以在C++中非常鼓励使用new和delete


14.构造函数和析构函数总结
析构函数在对象被销毁时调用,而对象的销毁时机与它所在的内存区域有关。
b.在所有函数之外创建的对象是全局变量,他和全局变量相似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数
c.在函数内部创建的对象是局部变量,它和局部变量类似,位于栈区,函数执行结束时会自动调用这些对象的析构函数
d.new创建的对象位于堆区,通过delete删除时才会调用析构函数,如果没有delete,析构函数就不会被执行。

































































































































原创粉丝点击