写更加高效的C++

2022-09-01 22:24  

我觉得需要捡起c++了,太久不写的话感觉会忘,,,

术语(Terminology)

声明式(declaration)是告诉编译器某个东西的名称和类型,但忽略细节,下面是声明式

extern int x;                           // 对象object声明式std::size_t numDigits(int number);      // 函数function声明式class Widget;                           // 类class声明式template <typename T>                   // 模板template声明式class GraphNode;                        // typename的使用条款

每个函数的声明揭示其签名式(signature),也就是参数和返回类型。一个函数的签名等同于该函数的类型。numDigits函数的签名式std::size_t (int),也就是说"这个函数获得一个int并返回一个std::sizt_t".

定义式(definition)的任务是提供编译器一些声明式所遗漏的细节.对对象而言, 定义式是编译器为此对象所分配内存的地点.对function或function template 而言,定义式提供了代码本体.对 class 或 class template 而言,定义式列出它们的成员:

int x;                                  // 对象的定义式std::size_t numDigits(int number) {     // 函数的定义式    std::size_t digitsSoFar = 1;        // 此函数返回其参数的数字个数    while ((number /= 10) != 0)        ++digitsSoFar;    return digitsSoFar;}class Widget {                          // class的定义public:    Widget();    ~Widget();    ...};template <typename T>                   // template的定义class GraphNode {public:    GraphNode();    ~GraphNode();    ...};
初始化是"给予对象初始值"的过程.对用户自定义类型的对象而言,初始化由构造函数执行.所谓default构造函数是一个可以被调用而不带任何实参.这样的构造函数或者没有参数,或者就是每个参数都有缺省值:
class A {public:    A();                                // default构造函数};class B {public:                                 // default构造函数    explicit B(int x = 0, bool b = true);};class C {public:    explicit C(int x);                  // 不是default构造函数};
上述的 class B和C的 构造函数都被声明为 explicit,这可阻止它们被用来执行隐式类型转换(implicit type conversions),但它们仍可被用来进行显式类型转换(explicit type conversions):
void doSomething(B bObject);            // 函数接受一个类型为B的对象B bObj1;                     doSomething(bObj1);                     // okB bObj2(28);doSomething(28);                        // error.int到B之间没有隐式转换doSomething(B(28));                     // ok.使用B构造函数将int显式转换为一个B
被声明为 explicit 的构造函数通常比non-explicit更受欢迎,因为它们禁止编译器执行非预期的类型转换.
copy构造函数被用来"以同型对象初始化自我对象",copy assignment操作符被用来"从另一个同型对象中拷贝其值到自我对象":
class Widget {public:    Widget();                               // default构造函数    Widget(const Widget &rhs);              // copy构造函数    Widget &operator=(const Widget &rhs);   // copy assignment操作符    ...};Widget w1;                                  // 调用default构造函数Widget w2(w1);                              // 调用copy构造函数w1 = w2;                                    // 调用copy assignment操作符
当看到赋值符号时请小心,因为"="语法也可用来调用copy构造函数:
Widget w3 = w2;                             // 调用copy构造函数
幸运的是 "copy构造"很容易和"copy赋值"有所区别.如果一个新对象被定义(例如以上语句中的w3),一定会有个构造函数被调用,不可能调用赋值操作.如果没有新对象被定义,就不会有构造函数被调用,那么赋值操作会被调用.
copy构造函数是一个非常重要的函数,因为它定义一个对象如何passed by value.考虑以下代码:
bool hasAcceptableQuality(Widget w);...Widget aWidget;if (hasAcceptableQuality(aWidget))    ...

参数w是以by value方式传递给hasAcceptableQuality,所以在上述调用中aWidget被复制到w体内.这个复制动作由Widget的copy构造函数完成.pass-by-value意味着"调用copy构造函数".以by value传递用户自定义类型通常是一个坏主意,pass-by-reference-to-const 往往是比较好的选择.

STL(standard template library)致力于容器,迭代器,算法以及相关机能.许多相关机能以函数对象实现,那是"行为像函数"的对象.这样的对象来自于重载operator()的 class.







小马过河啊
要好好学习呀!
 最新文章