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,析构函数就不会被执行。
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,析构函数就不会被执行。
相关文章推荐
- C++类和对象知识点整理
- C++类和对象知识点整理六-----多继承
- C++类和对象知识点整理七----虚基类和虚继承
- C++类和对象知识点整理二
- C++类和对象知识点整理四---继承
- C++类和对象知识点整理五----派生类的构造函数和析构函数
- C++类和对象知识点整理一
- 面向对象相关知识点整理(1)
- 面向对象相关知识点整理(一)
- C++类的存储及类对象内存结构(整理)
- Java知识点整理:第三章:java中的循环,数组,栈,对象
- Java Web 3.6 session对象知识点整理
- 其他常见对象知识点整理
- 黑马程序员_面向对象知识点整理
- PHP中面相对象对象的知识点整理
- C++类的存储及类对象内存结构(整理)
- 黑马程序员_面向对象知识点整理总结
- C++类和对象等基本知识整理
- PHP中面相对象对象的知识点整理
- Java知识点整理:第十三章:字符串的序列化(文字的编码方案)、字符流(Reader Writer)、对象序列化