介绍目录:

1.类成员

1.1 成员函数

1.2 构造函数

1.2.1 对构造函数的理解

1.2.2成员初始化列表

1.2.3必须使用成员初始化列表的几种情况

1.2.4对于拷贝构造函数的参数是一个引用的理解

1.2.5对深拷贝和浅拷贝的理解

1.3析构函数

1.3.1 单继承

1.3.2 多继承

1.4 操作符重载

1.4.1复制构造函数和赋值运算符的区别

2.成员函数的重载,覆盖和隐藏

2.1成员函数的覆盖

2.2成员函数的隐藏

1.类成员

1.1 成员函数

调用成员函数时,实际上是使用对象来调用的。每个成员函数(除static成员函数外)都有一个额外的,隐含的形参this.在调用成员函数时,形参this初始化为调用函数的对象的地址。

例如: void Point3d::translate(Point3d* const this,const Point3d &pt){

this->x+=pt.x;

this->y+=pt.y;

this->z+=pt.z;

}

1.2 构造函数

若使用编译器自动生成的默认构造函数,则类中的每个成员,使用与初始化变量相同的规则来进行初始化。

a.类成员:运行该类型的默认构造函数来初始化。

b.内置或符合类型的成员的初始值依赖于对象的作用域:在局部作用域中这些对象不被初始化。在全局作用域中,他们被初始化为0。

1.2.1 对构造函数的理解

假定有一个NoDefault类,他没有定义自己的默认构造函数,却有一个接受string实参的构造函数。因为该类定义了一个构造函数,因此编译器将不合成默认的构造函数,意味着:

1)具有NoDefault成员的每个类的每个构造函数,必须在成员初始化列表中通过传递一个初始的string值给NoDefault构造函数来显示的初始化NoDefault成员。

2)编译器将不会为具有NoDefault类型成员的类合成默认构造函数,如果需要提供默认构造函数,就必须显示定义。并且默认的构造函数必须显示的初始化NoDefault成员。

3)NoDefault类型不能用作动态分配数组的元素类型。

4)NoDefault类型的静态分配数组必须为每个元素提供一个显式的初始化式

5) 如果有一个保存NoDefault对象的容器,例如vector,就不能使用接受容器大小而没有同时提供一个元素初始化式的构造函数。

总结:如果定义了其他构造函数,提供一个默认构造函数总是对的。

1.2.2成员初始化列表

i是内存的垃圾数字,而j为0.

在c++中,成员变量的初始化顺序与变量在类型中的申明顺序相同,而与他们在构造函数中初始化列表的顺序无关。

1.2.3必须使用成员初始化列表的几种情况

对于没有默认构造函数的类类型的成员,以及const类型的成员变量和引用类型的成员变量,都必须在构造函数的初始化列表中进行初始化。

1.2.4对于拷贝构造函数的参数是一个引用的理解

如果拷贝构造函数中的参数不是一个引用,即形如:

CClass(const CClass c_class)

相当于采用传值的方式,而此时会调用该类的拷贝构造函数,从而造成无穷递归的调用拷贝构造函数,因此拷贝构造函数的参数必须是一个引用。

1.2.5对深拷贝和浅拷贝的理解

浅拷贝:被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝:被复制对象的所有变量都含有与原来对象相同的值,出去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制一遍。

1.3析构函数

不管类中是否定义了自己的析构函数,编译器都自动执行类中非static数据成员的析构函数。

虽然构造函数不能定义为虚函数,但是析构函数可以定义为虚函数。一般来说如果类中定义了虚函数,析构函数也因该定义为虚析构函数,尤其是类中有申请的动态内存,需要清理和释放的时候。

与复制构造函数和赋值操作符不同,无论类中是否定义了自己析构函数,都会创建和运行合成析构函数,如果类中定义了析构函数,则类中定义的析构函数运行完以后运行合成析构函数。

(拷贝构造函数采用的是系统自动生成的版本,没有输出)

1.3.1 单继承

派生时,构造函数和析构函数是不能继承的(复制构造函数和赋值操作符重载函数也不能继承),为了对基类成员初始化,必须对派生类的构造函数和析构函数重新定义,并在派生类的构造函数的初始化列表中调用基类的构造函数。

当对象被删除时,派生类的析构函数被执行,析构函数不能继承,所以,在执行派生类的析构函数时,基类的析构函数被自动执行。(顺序:先执行派生类的析构函数在执行基类的析构函数)

1.3.2 多继承

多继承时,派生类的构造函数初始化列表需要调用各个基类的构造函数。

此时构造函数初始化列表只能控制用于初始化基类的值,不能控制基类的构造次序,基类构造函数按照基类构造函数在类派生列表中出现的次序调用。

在虚继承中,首先调用虚基类的构造函数,虚基类如果有多个,则虚基类构造函数的调用顺序是此虚基类在当前类派生表中出现的顺序,而不是他们在成员初始化列表中的顺序。

1.4 操作符重载

1.4.1复制构造函数和赋值运算符的区别

复制构造函数只在对象实例化是才会被调用,在复制构造函数调用期间,这个对象处于未决状态,复制构造函数不返回任何值。而赋值操作符是在一个现存的对象被赋予新的值时被调用。有返回值。

c++中空类默认产生默认构造函数,析构函数,复制构造函数,赋值运算符重载函数,取址运算符重载函数,const取址运算符重载函数。

operator new 和operator delete  与c中malloc和 free对应,只负责分配和释放空间。(new为new operator  是new运算符)

2.成员函数的重载,覆盖和隐藏

只用在同一类中定义的同名函数才存在重载关系,主要特点是函数的参数类型和数目有所不同,但不能出现函数参数的类型和个数相同仅仅依靠返回值来区别函数。重载和成员函数是否为虚函数无关。

2.1成员函数的覆盖

覆盖是指在派生类中覆盖基类中的同名函数,要求基类必须是虚函数且:

1)与基类的虚函数有相同的参数个数

2)与基类的虚函数有相同的参数类型

3)与基类的虚函数有相同的返回类型或者与基类的虚函数的相同,或者返回指针(或引用)。并且派生类虚函数所返回的指针(引用)类型是基类中被替换的虚函数所返回的指针(引用)类型的子类型(派生类型)。

2.2成员函数的隐藏

隐藏是在某些情况下,派生类中的函数屏蔽了基类中的同名函数,这些情况包括:

1)

2)

对类的理解(c++)的更多相关文章

  1. [BS-18] 对OC中不可变类的理解

    对OC中不可变类的理解 OC中存在很多不可变的类(如NSString,NSAttributedString,NSArray,NSDictionary,NSSet等),用它们创建的对象存在于堆内存中,但 ...

  2. 对Java中properties类的理解

    转载于:https://www.cnblogs.com/bakari/p/3562244.html 一.Java Properties类 Java中有个比较重要的类Properties(Java.ut ...

  3. AtomicInteger类的理解与使用

    AtomicInteger类的理解与使用 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private stati ...

  4. FileChannel类的理解和使用

    FileChannel类的理解和使用(java.nio.channels.FileChannel) 知识点: 1.FileChannel类及方法理解:2.普通输入输出流复制文件:3.FileChann ...

  5. JavaScript es6 class类的理解。

    本着互联网的分享精神,在本篇文章我将会把我对JavaScript  es6 class类的理解分享给大家. JavaScript 类主要是 JavaScript 现有的基于原型的继承的语法糖. 类语法 ...

  6. PHP反射类的理解(代码篇)

    <?php/** * Created by PhpStorm. * User: * Date: 2017/6/12 * Time: 14:34 * 关于反射类的理解 */class Person ...

  7. java 面向对象(三十八):反射(二) Class类的理解与获取Class的实例

    1.Class类的理解 1.类的加载过程:程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾).接着我们使用java.exe命令对某个字节码文件进行解释运行.相当于将某个 ...

  8. java常用类,包装类,String类的理解和创建对象以及StringBuilder和StringBuffer之间的区别联系

    一.包装类的分类: 1.黄色部分的父类为Number 继承关系: Boolean Character 其他六个基本数据类型 2.装箱和拆箱 理解:一个例子,其他的都相同 装箱:Integer inte ...

  9. Python无类再理解--metaclass,type

    上次理解过一次,时间久了,就忘了.. 再学习一次.. http://blog.jobbole.com/21351/ ======================= 但是,Python中的类还远不止如此 ...

  10. android Scroller类的理解

    Scroller 一个特例: **点击Button后可能View没有移动,要关闭硬件加速,这段代码中int detalX = (int) (event.getX() - downX)要更正. demo ...

随机推荐

  1. Python 面向对象1-面向对象介绍

    一.无论用什么形式来编程,我们都要明确记住以下原则: 1.写重复代码是非常不好的低级行为 2.你写的代码需要经常变更,写代码一定要遵循易读,易改的原则 3.函数编程与OOP(面向对象)的主要区别就是O ...

  2. $on在构造器外部添加事件$once执行一次的事件$off关闭事件

    $on 在构造器外部添加事件. $on接收两个参数,第一个参数是调用时的事件名称,第二个参数是一个匿名方法. 如果按钮在作用域外部,可以利用$emit来执行. html <div id=&quo ...

  3. Echarts官网展示

    1.参考实例 http://echarts.baidu.com/examples/ 点击去的效果: 2.配置项手册 http://echarts.baidu.com/option.html#title ...

  4. 20165319 2017-2018-2《Java程序设计》课程总结

    一.每周作业链接汇总 预备作业一:我期望的师生关系 20165319 我所期望的师生关系 预备作业二:学习基础和C语言基础调查 20165319 学习基础和C语言基础调查 摘要: 技能学习经验 c语言 ...

  5. day 50 js-part1基础语法,数据类型及用法,流程控制语句,循环

    js基本概念: JavaScript 是世界上最流行的脚本语言. JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. JavaScript ...

  6. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

    IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...

  7. css3 webkit-box的用法

    webkit-box 1.之前要实现横列的web布局,通常就是float或者display:inline-block; 但是都不能做到真正的流体布局.至少width要自己去算百分比.2.flexibl ...

  8. POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)

    <题目链接> 题目大意: 有n个人,每个人都有一个或者几个能够归属的分类,将这些人分类到他们能够归属的分类中后,使所含人数最多的分类值最小,求出该分类的所含人数值. 解题分析: 看到求最大 ...

  9. POJ_2376_Cleaning Shifts【贪心】【区间覆盖】

    题目链接 题目大意: 有一些奶牛,每只奶牛负责一个时间段.问覆盖完全部的时间段最少需要多少只奶牛.若不能全部覆盖,输出-1. #include <cstdio>#include <a ...

  10. ul无点标签左移

    ul标签去除掉点,ul li 块仍会在原来的位置,即与上一块内容相对右移一点. 这是 ul标签的默认padding值导致的. 修改style或者CSS中的class为如下即可 { list-style ...