标签:拷贝构造函数 不可 就是 编程 说明符 依次 strong 默认参数 功能实现
4个特点:
1.继承了C语言的优点与语法,简介灵活,数据结构丰富,运行效率高
2.面向对象编程OOP(封装性、继承性和多态性)
3.增加了一些特性(引用、友元、重载)
4.标准模板库(算法、容器、迭代器)
//类定义的一般形式 class 类名 {private: 私有成员; public: 公有成员; protected: 受保护成员; }
访问限定符:public公有的、protected类受保护的成员、private类的私有成员
//定义对象的2种形式: 1---class 类名 对象名; 2---类名 对象对象名
访问对象成员的2种方法
//访问对象成员的2种方法
//1-通过对象名访问 对象名.成员变量 或 对象名.成员函数
//2-通过类对象的指针访问 对象指针->成员变量 或 对象指针->成员函数
类外定义成员函数的一般形式
返回值类型 类名::成员函数名(参数列表) { //函数体 }
对象所占的存储空间:为取决于对象中数据所占用的空间,与成员函数无关,成员函数为所有类的对象公有
this指针:在成员函数中使用,指向对象本身的指针,值为当前被调用的成员函数所在对象的起始地址(依次区分对象对同一段代码的调用)
构造函数:对类的对象进行初始化;
构造函数的3个特点:名字与类名统一;public类型,无返回值;自动调用,仅调用一次;、
无参和有参的构造函数:构造函数无参时可以进行直接赋值初始化(数据固定);有参构造函数可以根据需要实现不同的初始化;
有参构造函数的使用:实参在对象定义时给定;实现对不同对象不同的初始化;
默认与传递参数的构造函数:默认时使用固定赋值构造函数(即在类内默认传入具有一般情况参数),需要改变时使用有参构造函数导入;
拷贝构造函数:通过同一类的其他对象初始化一个新的对象;
一般形式:
class 类名 {public: 类名(形参);//构造函数 类名(类名 &对象名);//拷贝构造函数 }; 类名::类名(类名 &对象名) { //函数体 }自动调用拷贝构造函数的三种情况:通过声明初始化复制对象时;对象按值传递给函数时;从函数按值返回给对象时;
默认拷贝构造函数:诸位复制对象(没太明白)
析构函数:完成最后操作,对象使用完后撤销对象,回收内存空间;
析构函数的三个特点:析构函数名与类名相同,前面有个~标志符号;不能接受任何参数也无返回类型;一个类只有一个析构函数;
程序调用析构函数的三种情况:函数执行完毕后,其调用的对象析构;程序执行的作用域离开了所定义的全局对象时;delete定义的对象,回收内存空间时;
析构函数的作用:执行对象最后需要执行的动作,清理对象,回收内存空间;
//定义 申请内存空间 赋值 类型 *指针 = new 类型(赋值);
//删除指针,回收内存空间 delete 指针;
其中此时指针仍然存在,可以再次进行赋值,必须进行置空,但是不能连续delete,会导致程序崩溃
//释放数组时添加[]符号 delete []Name;
使用自定义拷贝构造函数的必要性:需要在构造函数中为指针再次赋值,避免连续两次调用析构函数delete对象程序崩溃;
引用声明符:&;‘
//引用的初始化形式(为引用对应某一具体目标) 类型 &引用变量名 = 已定义变量名;
参数传递的三种方法:值传递、地址传递与引用传递;
引用传递:将引用传递给函数,传递的是实际参数本身,而不是建立的临时副本;
引用传递与地址传递的比较:值传递由于是变量副本原因无法达到目的,地址传递和引用传递可以实现;变量传递多次使用*,程序编写和阅读不宜;引用传递形式类似值传递,更加简单。
返回引用:类型 &函数名(引用参数列表);
值传递、地址传递与引用传递返回值的比较:返回引用引形式类似值返回,效率与地址引用相同。
友元关系:通过friend从类外访问类的私有成员,有友元函数、友元成员、友元类三种;
//友元函数:类外定义的访问类的私有成员的普通函数 //友元函数类定义体声明 friend 函数返回类型 函数名(参数列表); //友元成员:可以访问类私有成员的另一个类的成员函数 //友元成员类定义体声明 函数返回类型 类名::函数名(参数列表); //友元类:可以访问类私有成员的另一个类,其所有成员均为友元成员 //友元类类定义体声明 friend class 类名;
友元成员、友元类、友元的几点注意:友元声明可以放在类的公有部分,也可以放在私有部分;友元关系不具有传递性;友元关系不具有对称性;友元关系要慎用;
重载:“同一标识符”在同一作用域下具有不同的语义,包括函数重载与运算符重载;
函数重载:具有不同参数列表(参数项个数、参数类型至少一项不同)和相同函数名的函数,可以根据需要完成不同的功能实现重载;
运算符重载:对已有运算符赋予不同功能,以便实现对不同数据的处理功能;(不允许使用的有:.成员访问运算符、.*成员指针运算符、::作用域运算符、sizeof类型大小运算符、?:三目运算符)
运算符重载的规则:大多可以重载(除上述少数几个);重载不改变操作数个数;重载不改变运算符优先级和结合性;重载运算符函数不允许有默认参数;操作数中至少有一个自定义类型;类对象运算符处“=”和“&”必须重载;重载是对原有功能的改造和强化;
运算符重载的形式:重载为类的友元函数和重载为类的成员函数;
注意:有的运算符(赋值运算符、下标运算符、函数调用运算符等)必须重载为类的成员函数;有的运算符(输入流插入和提取运算符、类型转换运算符)不能重载为类的成员函数。
friend type operator 运算符(形式参数表);
继承:新类继承已经存在的一个类的所有成员,并且可以在新类中加入新的操作以实现新的功能,产生的新类成为子类(派生类),已存在的类称为父类(基类);
单继承:派生类只有一个基类的继承;
多继承:派生类具有到多个基类的继承;
//派生类单继承时的声明方式 class 派生类名:[继承方式] 基类名 { //派生类新增成员; }
三种继承方式:public公有继承、protected保护继承、private私有继承;
基类成员在派生类中的访问属性
继承方式 | 基类成员 | 在派生类中的访问属性 | 派生类中的成员函数 | 派生类的对象 |
public |
public | public | 可访问基类中的公有成员和保护成员 | 可访问基类中的公有成员 |
protected | protected | |||
private | 不可访问 | |||
protected | public | protected | 可访问基类中的公有成员和保护成员 | 不可访问 |
protected | protected | |||
private | 不可访问 | |||
private | public | private | 可访问基类中的公有成员和保护成员 | 不可访问 |
private | private | |||
private | 不可访问 |
派生类的构造函数与析构函数:基类中的构造函数与析构函数不被派生类所继承,因此派生类构造与析构函数在完成新有成员的初始化的基础上还需要考虑对基类成员的初始化等操作;
//派生类构造函数的一般形式 派生类名(总参数表):基类名(参数表),子对象名(参数表) { 派生类中新增数据成员的初始化; }
派生类构造函数的执行顺次序:基类构造函数;子对象构造函数;子类构造体;
派生类析构函数的执行次序:派生类析构函数;子对象析构;基类析构;
多态:同样的消息被不同的对象接收产生了不同的行为;(不是很明白)
类家族:一个继承层次中的所有类;
指针规则:一个指向基类的指针可以指向基类所派生的类家族中的所有子类对象;
同化效应:类家族中的同名函数以基类执行优先(指向派生类对象的指针被同化成基类对象的同名函数);
继承呼唤多态:类家族中不同派生类对象可以共存的同时具有分辨不同类对象的能力;
虚函数:virtual 类型说明符 函数名(参数列表);
虚函数继承规则:基类中的虚函数会被自动继承为子类中的虚函数;
虚函数与指针配合使用:允许派生类对继承的函数进行功能的重新定义;
关联(绑定):确定调用的具体对象的过程;静态关联---确定编译时的多态性;动态关联(滞后关联)---确定运行时的多态性;
模板:使得同一个函数或类处理不同的数据类型,快速建立具有类型安全的函数集合和类库集合;
函数模板经过参数的实例化(模板实参推断)形成模板函数;模板类经过参数的实例化(模板实参推断)形成模板类;
//函数模板 template <模板参数表> 返回类型 函数名(参数表) { //函数体 } //e.g. template <class T> void swap(T &n1, T &n2) { T temp = n1; n1 = n2; n2 = temp; }
//类模板 template <模板参数表> class 类名(参数表) { //类模板定义 }; //类外定义类模板成员函数 返回类型 类名<类型列表>::成员函数(参数表) { //成员函数定义体; }; //类模板实例化 类模板名<实参表> 对象名;
标签:拷贝构造函数 不可 就是 编程 说明符 依次 strong 默认参数 功能实现
原文地址:https://www.cnblogs.com/zouhq/p/10576699.html