Core List
1. pass-by-value 相对于 pass-by-reference-to-const 的劣势
(1) copy 效率低
bool checkHealth(Student s);
Student boxi;
bool is_boxi_ok = checkHealth(boxi);
注:
a. 代码执行中,将调用拷贝构造函数,使用已存在student 对象 boxi,初始化形参对象 s。
b. 在函数调用完成后,将调用 student 的析构函数,释放对象s。(若使用pass-by-reference-to-const 则不会新创建对象,即无构造函数和析构函数的调用)
c. 由于 pass-by-value 中,函数操作的是实参的副本,不会影响实参,因此,在 pass-by-reference-to 时,为避免实参被修改,因此添加 const 修饰符。
(2) 对象被切割
class Base {
public:
virtual void display() const;
};
class Derived :: Base {
public:
virtual void display() const;
};
void print (Base b) {
b.display();
}
Derived d;
print (d); // 调用的是基类的 display 函数,因为产生的是基类的对象 b, 该b 是由实参d 的基类部分成员变量初始化的。
2. “拷贝成本低” 的错误理解
(1) “小对象” : 许多对象内涵的东西只比一个指针多一些,但复制这种对象缺需承担“复制哪些指针所指的每一样东西”。
(2)“用户自定义类型” :编译器对待“内置类型”和“用户自定义类型”的态度截然不同,纵使两者拥有相同的底层表述。
(3) 自定义类型当前小,之后可能会变得很大。
3. 优先使用 pass-by-value 的情况
(1) 内置类型
(2) STL迭代器(本身为指针)
(3) 函数对象(本身为指针)
注:pass-by-reference-to-const 的底层为指针的传递,因此对于对象自身即为指针时,可直接使用pass-by-value