您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-29 08:43 316 查看
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,析构函数就不会被执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息