我觉得需要捡起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();
...
};
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构造函数
};
void doSomething(B bObject); // 函数接受一个类型为B的对象
B bObj1;
doSomething(bObj1); // ok
B bObj2(28);
doSomething(28); // error.int到B之间没有隐式转换
doSomething(B(28)); // ok.使用B构造函数将int显式转换为一个B
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操作符
Widget w3 = w2; // 调用copy构造函数
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.