软件编写的目标:易理解、易维护、可移植、可扩充、高效、并且有着预期的行为。
学习程序语言是一回事,学习如何以某种语言设计并实现高效程序则是另一回事。如下为强化程序与设计的建议几何。
术语(Terminology)——一份每一个程序员都应该了解的C++词汇
声明式(Declaration)
所谓声明式,是告诉编译器某个东西的名称和类型(type)
,但略去细节。如下都为声明式:
extern int x;//对象(object)声明式
std::size_t numDigits(int number);//函数(function)声明式
class Widget;//类(class)声明式
template<typename T>//模板(template)声明式
class GraphNode;
注意,当谈到整数x
时称其为一个对象(object)
,即使它是个内置类型。也要注意,函数numDigit
的返回类型是std::size_t
,这表示类型size_t
位于命名空间std
内。
每个函数的声明揭示了其签名式(Signature)
,也就是参数和返回类型。一个函数的签名等同于该函数的类型。numDigits函数
的签名是std::size_t(int)
,也就是说“这函数获得一个int并返回一个std::size_t”。C++对签名式的官方定义并不包括函数的返回类型,不过,此处会把返回类型视为签名的一部分。
定义式(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();
...
}
初始化(Initialization)
初始化是“给予对象初值”的过程。对用户自定义类型的对象
而言,初始化由构造函数执行。所谓default构造函数
是一个可被调用而不带任何实参的函数。这样的构造函数要不没有参数,要不就是每个参数都有缺省值:
class A{
public:
A();//default构造函数
};
class B{
public:
explicit B(int x=0,bool b=true);//default构造函数
};
class C{
public:
explicit C(int x);//不是default构造函数
}
classes B和C的构造函数都被声明为explicit,这可阻止它们被用来执行隐式类型转换(implicit type conversions)
,但它们仍可被用来进行显示类型转换(explicit type conversions)
:
void doSomething(B bObject);//函数,接受一个类型为B的对象
B bObj1;//一个类型为B的对象
doSomething(bObj1);//正确,传递一个类型为B的对象给doSomething函数
B bObj2(28);//正确,根据int 28建立一个B对象
doSomething(28);//错误,doSomething应该接受一个B,不是一个int,而int至B之间并没有隐式转换
doSomething(B(28));//正确,使用B构造函数将int显式转换(也就是转型,cast)为一个B以促成此一调用
被声明为explicit
的构造函数通常比其non-explicit兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非有一个好理由允许构造函数被用于隐式类型转换,否则一般会把构造函数声明为explicit
。
copy构造函数
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构造函数
标准模板库(Standard Template Library,STL)
STL是C++标准程序库的一部分,致力于容器(vector,list,set,map
)、迭代器(vector<int>::iterator,set<string>::iterator
)、算法(for_each,find,sort)及相关机能。许多相关机能以函数对象(function objects)实现,那是“行为像函数”的对象。这样的对象来自于重载operator()(function call操作符)的classes。