资源管理类,形参初始化顺序,传引用和传递值的区别?对象切割问题?当派生类传递给以下函数时发生什么?为什么运算符重载,返回value,形参是引用?成员尽量用private,non-member函数

资源管理类

资源管理类,形参初始化顺序,传引用和传递值的区别?对象切割问题?当派生类传递给以下函数时发生什么?为什么运算符重载,返回value,形参是引用?成员尽量用private,non-member函数

形参初始化顺序

资源管理类,形参初始化顺序,传引用和传递值的区别?对象切割问题?当派生类传递给以下函数时发生什么?为什么运算符重载,返回value,形参是引用?成员尽量用private,non-member函数

传引用和传递值的区别?

效率方面:
1.传值:对于类,会调用拷贝构造函数。
2.传引用:不会调用构造函数。
对于内置类型、stl迭代器、函数对象传值效率更好。

对象切割问题?当派生类传递给以下函数时发生什么?

fun(const 基类&w){}//w是派生类
fun(基类w){}//w是基类,派生类被切割了
#21
local变量 stack空间 函数退出前销毁
new创建 heap空间

不要返回

1.指针/引用->local stack对象、local static 对象(唯一)
2.引用->heap分配的对象

为什么运算符重载,返回value,形参是引用?

以*为例子

  1. 重载运算符要写operate*(参数1,参数2)
  2. 积 放在哪里呢?
    如果放在堆里
    operate*(const A& a,const A& b){
    new c;
    return *c;
    }//可能资源泄露,用户忘记delete
    如果放在栈里,函数结束后就被销毁。
    3)所以返回value,一个副本
    形参是引用是为了效率。

22 成员尽量用private

原因:

  1. 类代码修改,使用public成员的客户可能受影响
  2. 类代码修改,使用protected的派生类可能受影响

23封装的程度怎么衡量?怎么方便地扩展工具包?

衡量标准:访问成员数据的函数数量,数量反比与封装程度。
解决方法:用非成员函数、非友元函数。
前提知识:命名空间namespace可以跨过不同文件。
资源管理类,形参初始化顺序,传引用和传递值的区别?对象切割问题?当派生类传递给以下函数时发生什么?为什么运算符重载,返回value,形参是引用?成员尽量用private,non-member函数

24如果函数的形参都需要类型转换,则定义为non-member

案例:

为什么需要类型转换?

当定义数值类时,比较自然,比如有理数类。

为什么定义为non-member函数?

比如定义乘法operate 是成员函数
2
object;//无法通过编译
因为2是*this,只有形参会自动转换,this不会。
解决方法:
都放到形参里面
资源管理类,形参初始化顺序,传引用和传递值的区别?对象切割问题?当派生类传递给以下函数时发生什么?为什么运算符重载,返回value,形参是引用?成员尽量用private,non-member函数