赋值运算符重载和内联函数

一、赋值运算符重载
1、概念:
重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同,使用运算符重载可以提高代码的可读性。
不可以重载的运算符 :
· 成员选择符
·* 成员对象选择符
:: 作用域解析操作符
?: 条件操作符
sizeof

除了赋值符号外,基类中被重载的操作符都将被派生类继承。

2、特点

·不能通过连接其他符号来创建新的操作符:比如operator@
·重载操作符必须有一个类类型或枚举类型的操作数
·用于内置类型的操作符,其含义不能改变
·作为类成员的重载函数,其形参看起来比操作数数目少1,因为成员函数的操作符有一个默认的形参this,限定为第一个形参;
·一般将算术操作符定义为非成员函数,将赋值运算符定义为成员函数
·操作符定义为非类的成员函数时,一般将其定义为类的友元
·== 和 != 操作符一般要成对重载
·下标操作符[]:一个是非const成员并返回引用,一个是const成员并返回引用
·解引用操作符*和->操作符,不显示任何参数
·前置++/--必须返回被增量或减量的引用,后缀式操作符必须返回旧值,并且应是值返回而非引用
·输入操作符>>和输出操作符<<必须定义为类的友元函数
class Date
{
public:
    Date(int year = 2018, int month = 8, int day = 7)
        : _year(year)
        , _month(month)
        , _day(day)
    {
        cout << "Date(int,int,int):" << this << endl;
    }

    // 用已经存在的对象构造新对象
    Date(const Date& d)
        : _year(d._year)
        , _month(d._month)
        , _day(d._day)
    {
        cout << "Date(const Date&):" << this << endl;
    }

    Date& operator=(const Date& d)
    {
        if (this != &d)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }

        return *this;
    }
    // 前置++
    Date& operator++()
    {
        _day += 1;
        return *this;
    }

    // 后置++
    Date operator++(int)
    {
        Date temp(*this);
        _day += 1;
        return temp;
    }

    //前置--
    Date& operator--()
    {
        _day -= 1;
        return *this;
    }

    //后置--
    Date operator--(int)
    {
        Date temp(*this);
        _day -= 1;
        return temp;
    }

二、内联函数
1、概念:
用inline修饰的函数叫做内联函数,**编译时**C++编译器会进行代码替换,没有函数压栈的开销,故内联函数可以提升程序的运行效率。
2、特性:

·inline是一种以空间换时间的做法,省去了调用函数的开销,所以代码很长或者有循环/递归的函数不适合使用内联
·inline对于编译器而言,只是一个建议,编译器会自动优化,若定义为inline的函数体内有循环/递归等,编译器优化时会忽略掉内联
·inline必须与函数定义放在一起,才能形成内联函数,仅将inline放在函数声明前是不起作用的
·定义在类内的成员函数默认为是内联函数

3、宏和内联函数的区别:
宏优点:可以提高运行效率;
宏缺点:

    (1)不会进行类型检测;
    (2)代码膨胀;
    (3)有副作用(++);
    (4)不能调试.

内联函数的优点:

(1)内联函数在编译时会进行类型检测,而宏不会;
(2)内联函数没有副作用;
(3)可以进行调试.

内联函数的缺点:

(1)编译效率降低(编译时进行代码替换);
(2)代码膨胀.

4、注意:
· 在C++中强制建议使用const代替宏常量,使用内联函数代替宏函数,因为const和内联函数在编译时不仅进行代码替换,而且还会进行类型检测,提高了程序的安全性。
· 内联函数可以是普通函数,也可以是类的成员函数;函数式宏不能作为类的成员函数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第1章 基本类型 1.1 一个例程 1.2 类型与声明 1.3 基本类型 1.3.1 整数类型 1.3.2 字符类型 1.3.3 浮点类型 1.3.4 布尔类型 1.3.5 void类型 1.4 数值极限 1.5 标识符和关键词 1.5.1 标识符 1.5.2 关键词 1.6 练习 第2章 表达式和语句 2.1 作用域和存储分类 2.1.1 局部变量和全局变量 2.1.2 外部变量和寄存器变量 2.2 表达式 2.2.1 算术表达式 .2.2.2 关系表达式 2.2.3 逻辑表达式 2.2.4 位运算表达式 2.2.5 逗号表达式 2.3 语句 2.3.1 声明和初始化 2.3.2 赋值语句 2.3.3 复合赋值语句 2.3.4 增值减值语句 2.3.5 复合语句 2.3.6 条件语句 2.3.7 循环语句 2.4 斐波纳契数 2.5 练习 第3章派生类型 3.1 常量和宏 3.2 枚举类型 3.3 数组 3.4 结构 3.5 联合和比特域 3.6 指针 3.6.1 指针运算 3.6.2 多重指针 3.6.3 偏移量指针 3.6.4 常量指针 3.6.5 void指针和空指针 3.6.6 结构指针 3.6.7 字符指针 3.6.8 指针和数组 3.7 引用 3.8 函数 3.8.1 函数声明和定义 3.8.2 函数重载 3.8.3 参数传递 3.8.4 返回值 3.8.5 递归函数 3.8.6 内联函数 3.8.7 缺省参数 3.8.8 函数类型 3.8.9 静态局部变量 3.8.10 main函数 3.9 程序的运行空间 3.10 运算符概要及优先级 3.11 标准数学函数库 3.12 多项式求值 3.13 梯形公式和simpson公式 3.14 练习 第4章 命名空间和文件 4.1 命名空间 4.1.1 使用声明和指令 4.1.2 多重接口 4.1.3 命名空间别名 4.1.4 无名命名空间 4.1.5 名称查找 4.2 包含文件 4.2.1 包含标准库文件 4.2.2 用户自定义头文 4.2.3 条件包含指令 4.2.4 文件包含 4.3 源文件和连接 4.3.1 独立编译 4.3.2 外部连接和内部连接 4.3.3 与其他语言连接 4.4 一些有用的工具 4.4.1 给程序计时的方法 4.4.2 编译选项和调试器 4.4.3 创建库 4.4.4 makefile 4.5 字符串标准函数库 4.5.1 声明和初始化 4.5.2 操作 4.5.3 c语言字符串 4.5.4 输入输出 4.5.5 c字符串函数库 4.6 流标准函数库 4.6.1 整数格式化输出 4.6.2 浮点数格式化输出 4.6.3 输出宽度 4.6.4 文件的输入输出 4.6.5 字符的输入输出 4.6.6 字符串流 4.7 非线性方程的迭代解法 4.7.1 二分法 4.7.2 牛顿法 4.8 练习 第5章 类 5.1 类的声明与定义 5.2 拷贝构造函数和拷贝赋值 5.3 友元 5.4 静态成员 5.5 常量和可变成员 5.6 类的对象作为成员 5.7 类的数组 5.8 成员指针 5.9 常微分方程的数值解法 5.10 练习 第6章 运算符重载 6.1 复数 6.1.1 初始化 6.1.2 缺省拷贝构造和赋值 6.1.3 转换和混合模式运算 6.2 运算符函数 6.3 向量和矩阵 6.4 显式和隐式类型转换 6.5 效率和运算符重载 6.6 共扼梯度算法 6.7 练习 第7章 模板 7.1 类模板 7.1.1 成员和友元定义 7.1.2 模板实例化 7.1.3 模板参数 7.1.4 类型等价 7.1.5 用户定义的特化 7.1.6 特化顺序 7.2 函数模板 7.2.1 函数模板参数 7.2.2 函数模板重载 7.2.3 特化 7.2.4 类模板作为函数模板参数 7.2.5 成员函数模板 7.2.6 友元函数模板 7.3 模板源代码组织 7.4 标准复数库 7.5 标准ualarray库 7.5.1 ualarray类型 7.5.2 分段数组 7.5.3 广义分段数组 7.5.4 掩码数组和间接数组 7.6 数值算法标准函数库 7.6.1 累加 7.6.2 内积 7.6.3 部分和 7.6.4 临近差分 7.7 数值积分的高效技术 7.7.1 函数对象方法 7.7.2 函数指针作为模板参数 7.7.3 使用点积和模板表达式 7.7.4 采用点积和模板元程序 7.8 多项式插值 7.8.1 拉格朗日形式 7.8.2 牛顿形式 7.9 练习 第8章 类的继承 8.1 派生类 8.1.1 成员函数 8.1.2 构造函数和析构函数 8.1.3 拷贝 8.1.4 类层次结构 8.1.5 虚函数 8.1.6 虚析构函数 8.2 抽象类 8.3 访问控制 8.3.1 访问成员 8.3.2 基类访问 8.4 多重继承 8.4.1 去除二义性 8.4.2 重复基类 8.4.3 虚基类 8.4.4 多重继承中的访问控制 8.5 运行时的类型信息 8.5.1 动态投影机制 8.5.2 类型标识机制 8.5.3 运行时负担 8.6 用静态多态代替虚函数 8.7 练习 第9章 异常处理 9.1 抛出和捕获 9.2 派生异常 9.3 捕获异常 9.3.1 重抛出 9.3.2 捕获所有异常 9.3.3 处理函数的顺序 9.4 在函数中指定异常 9.5 标准异常 9.6 练习 第10章 容器和算法标准库 10 标准容器 10.1 向量 10.2 链表 10.1.3 映射与集合 10.1.4 栈和队列 10.2 标准算法 10.2.1 排序、复制和替换算法 10.2.2 搜索和遍历算法 10.2.3 集合、排列和堆算法 10.3 标准函数对象和适配器 10.3.1 算术函数对象 1o.3.2 关系函数对象 10.3.3 逻辑函数对象 10.3.4 标准适配器 10.4 练习 第11章 线性方程组求解法 11.1 矩阵存储格式 11.1.1 满矩阵 11.1.2 带状矩阵 11.1.3 稀疏矩阵 11.2 矩阵类层次 11.3 迭代算法 11.3.1 共轭梯度方法 11.3.2 广义最小残差法 11.3.3 预处理技术 11.4 高斯消元法 11.4.1 lu分解 11.4.2 高斯消元法 11.4.3 主元高斯消元法 11.5 求解偏微分方程的有限差分方法 11.6 练习 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值