一、语言联邦
- c语言
- C++ 最初是作为 C 语言的扩展而开发的,因此保留了许多 C 语言的基本语法和特性。
- Object-Oriented C++
- C++ 支持类、继承、多态等面向对象编程的特性,这使得 C++ 成为一种强大的面向对象编程语言。
- Template C++
- C++ 中可以使用模板来实现泛型编程,这是一种非常强大的编程技术。
- STL
- C++ 中支持元编程,即在编译期间生成代码,这可以极大地提高程序的性能和效率。
二、理解
- C++ 的设计理念是将多个组件集成到一个语言中,这些组件可以在不同的领域中独立使用,相互之间并没有强制的依赖关系。C++ 被称为“语言联邦”,意味着它不是一个纯粹的语言,而是由多个组件组成的复合语言,每个组件都有各自的设计思想和语法规则。
- 对内置类型(例如整数、浮点数等)而言,pass-by-value比pass-by-reference高效。
- 内存访问速度更快:当使用 pass-by-value 时,函数操作的是传递的值的副本,这些值通常被放置在寄存器或者栈中,而这两种内存区域的访问速度比较快。相比之下,pass-by-reference 需要通过间接访问内存,即通过指针或引用来获取实际的值,增加了一定的额外开销。
- 数据拷贝开销低:传递内置类型的值通常只需要进行简单的数据拷贝操作,拷贝小型的值在内存中非常快速。而对于 pass-by-reference,需要传递指针或引用,这可能需要更大的内存拷贝操作。
- 避免意外修改:当使用 pass-by-value 传递内置类型时,被调用函数无法修改原始参数的值。这对于保证代码的可预测性、简化调试和程序的正确性都是有益的。(当然这一条是要看具体的需求而定,不能一概而论)
- 对类类型而言,pass-by-reference-to-const更好。
- 减少数据拷贝:使用引用传递可以避免进行数据拷贝,从而减少内存占用和时间消耗。
- 优化构造函数调用:由于不需要进行拷贝构造函数或移动构造函数,所以 pass-by-reference-to-const 通常比 pass-by-value 更快。
- 避免意外的状态改变:使用 const 关键字可以确保被调用函数不会意外修改参数对象的状态,从而更加可预测、可维护和安全。
- 在处理类类型时,pass-by-reference-to-const 是一种更优秀的选择,但对于小型内置类型,pass-by-value 通常更为高效。无论何种情况下,最好避免使用 pass-by-reference-to-non-const(引用传递且非 const),除非确实需要在被调用函数中修改参数对象的状态。对于设备而言,也应该根据具体需求选择合适的参数传递方式。
- STL的迭代器和函数对象都是在C指针之上塑造出来的,故pass-by-value依然有效。
- 通过在 C 指针的基础上进行抽象和扩展,STL 的迭代器和函数对象使得操作数据结构和算法变得简单、灵活和可复用。迭代器提供了通用的遍历机制,使得可以对不同类型的容器使用相同的算法;而函数对象则提供了更灵活的行为定制和算法扩展能力。
- 由于STL的迭代器和函数对象都是在C指针之上进行了封装和扩展,它们内部仍然基于指针的机制。因此,传递这些对象时,即使使用pass-by-value,仍然可以有效地进行拷贝操作。
- 它们的内部实现可能会使用指针或与指针相关的机制来操作数据结构。但是,STL的设计目标是提供更高级、更抽象的接口,以简化开发人员的工作并提供更强大的功能。
- 尽管STL的迭代器和函数对象可能基于指针,但它们被封装成对象,并提供了额外的功能和抽象层次。这意味着在使用迭代器和函数对象时,无需关心底层指针的细节,而是可以直接操作对象的接口。传递这些对象时,依然可以使用pass-by-value,因为对象会进行拷贝操作,并且拷贝构造函数和拷贝赋值运算符已经根据具体的封装机制进行了实现。