资源管理类,形参初始化顺序,传引用和传递值的区别?对象切割问题?当派生类传递给以下函数时发生什么?为什么运算符重载,返回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,形参是引用?
以*为例子
- 重载运算符要写operate*(参数1,参数2)
- 积 放在哪里呢?
如果放在堆里
operate*(const A& a,const A& b){
new c;
return *c;
}//可能资源泄露,用户忘记delete
如果放在栈里,函数结束后就被销毁。
3)所以返回value,一个副本
形参是引用是为了效率。
22 成员尽量用private
原因:
- 类代码修改,使用public成员的客户可能受影响
- 类代码修改,使用protected的派生类可能受影响
23封装的程度怎么衡量?怎么方便地扩展工具包?
衡量标准:访问成员数据的函数数量,数量反比与封装程度。
解决方法:用非成员函数、非友元函数。
前提知识:命名空间namespace可以跨过不同文件。
24如果函数的形参都需要类型转换,则定义为non-member
案例:
为什么需要类型转换?
当定义数值类时,比较自然,比如有理数类。
为什么定义为non-member函数?
比如定义乘法operate 是成员函数
2object;//无法通过编译
因为2是*this,只有形参会自动转换,this不会。
解决方法:
都放到形参里面