C++学习笔记(二)多态性(含运算符重载)

重载(函数/运算符)属于静态多态性(编译时的多态性)

虚函数属于动态多态性(运行时的多态性)

多态性:操作接口具有表现多种形式的能力(能根据操作环境的不同采用不同的处理方式)

分类:重载多态、强制多态、多态多态、参数多态

         绑定是指把一个标识符名和一个存储地址联系在一起,分为动态绑定(工作运行阶段进行)和静态绑定(编译连接阶段进行)

运算符重载:

         不能重载的运算符:”.”、“.*”、“::”、“?::”

         不改变原有的优先级和接合性

         重载方式:类的静态成员函数、非成员函数(主要运算对象,一般会声明为友元函数)

         重载形式:

                   函数类型 operator 运算符 (形参) {  }

                   Obj1 + Obj2:                                                                                                            函数名     防止被修改 节省空间

                   类型为成员函数时:参数个数=源操作数-1(后置++、--除外) Obj1.operator + (const &Obj2) const {  }

                                                                                                                         Complex Complex::operator + (congest Complex &c2) const

                            前置单目运算符(无形参) U oprd = oprd.operator U()

                            后置双目运算符 oprd++ = oprd.operator ++ (o)

        //后置++返回一个副本,但本身已经+1了

                   类型为非成员函数时: 参数个数=原操作数个数,但至少有一个自定义操作类型的参数

         流运算符(>>/<<)只能重载为非成员函数,因为其左操作数只能是流对象(ostream/istream)

         动态多态性(虚函数)

                   Virtual void Function() { } 不进行早绑定,运行时用指针来确定具体函数体(编译器自动准备了虚函数表)

                   实现原理:在类中有一个特殊的指针指向虚函数表(无法显式访问),不同的对象通过调用该指针来访问虚函数表。

                   虚析构函数:通过基类指针来删除派生类对象。

模板

         函数模板 template<模板参数表>

(类型<class>、常量参数<类型 标识符>、模板参数<template <> class 标识符>)

                            template < typename T >

                            T Abs(T x)

                            { return x<0? –x:x; }

         类模板

                            template <模板参数表>

                            Class 类名 { 内容 };

                            类外调用:   Template< X >

                                                        类型名 类名<模板参数标识符列表> :: 函数名(参数列表)

                            派生类调用: Store<double> Stud1,Stud2; //类模板调用前需要先对类模板进行实例化

                            类中不改变对象数据的函数可以定义为const如: int GetSize() const

线性结构:

         访问方法:直接访问(a[3])、顺序访问(从第一个开始依次访问)、索引访问

         数组:     静态数组:大小在编译时确定、无法修改大小

                            动态数组(自定义Arry类):元素个数可以在运行时改变(开销较大 删除原数据结构重新生成新的数据结构)// vector就是用类模板实现的动态数组

                   Ps. 重载函数的返回值-

                                     返回引用(&T)可以放到等号的左边进行赋值操作,返回静态数据(const T)无法进行赋值操作,但是可以防止意外更改。

 

         链表:由结点组成,每个结点包含数据域和指针(rear)

 

                   插入:     1.新节点的指针先指向后继对象(防止内存泄露 )

                                     2.断开原连接

                                     3.前趋对象指针连接到新节点上

                                     template <class T>

                                     void Node<T>::insertAfter(Node<T> *p)

                                     {

                                               p->next = next;

                                               next = p;//当前节点的指针指向p

}

                   删除:       

                   链表基本操作:生成结点、插入、查找、删除、遍历链表、清空链表

 

 

         栈和队列

                   栈:用于运算多项式

                           略(详见数据结构)

                   队列:略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值