在变量定义前加extern表示声明一个变量但不定义它,例如:
extern int a;
extern 也可用于函数声明。例如:
extern int func(int, int);
但对于函数声明extern不是必须的。
对变量和函数进行声明后就可以使用别人的函数了,但是大部分的库包含众多的函数和变量。要使用多个,自己声明起来既麻烦也容易出错,这时可以使用包含头文件的方法。头文件是一个包含某个库的外部声明函数和变量的文件,其中已经包含了函数和变量的声明信息。因而,用户只需使用预处理指令#include包含由创建库的程序员提供的头文件就可以了。
static member function 的主要特性就是没有this指针。以下的次要特性统统根源于其主要特性:
1.它不能直接存取其class中的nonstatic members.
2.它不能被声明为const ,volatile或virtual。
3.它不需要经由class object才被调用。
default constructor、copy constructor、copy assignment operator以及destructor只有在必要时才有编译器产生出来。而对于前三者,这种“必要
”意指当class不展现bitwise copy semantics时,才会构造出一个nontrivial的default constructor、copy constructor、copy assignment operator。
构造函数
对于class X,如果没有任何user-declared constructor,那么会有一个default constructor被暗中(implicitly)声明出来,一个暗中声明出来的constructor将是一个没有用的constructor。
但是在以下四种情况下,被合成出来的构造函数是有用的(nontrivial):
1.带有default constructor的member class object。
2.带有default constructor的base class。
3.带有virtual function 的class
4.带有virtual base class的class。
拷贝构造函数
不展现“bitwise copy semantics”也有四种情况:
1.当class内含一个member object而后者的class声明中有一个copy constructor。
2.带有copy constructor的base class。
3.带有virtual function 的class
4.带有virtual base class的class。
copy assignment operator不展现“bitwise copy semantics”也有四种情况也前两者几乎一样:
1.当class内含一个member object而后者的class声明中有一个copy assignment operator。
2.带有copy assignment operator的base class。
3.带有virtual function 的class
4.带有virtual base class的class。
析构函数
如果class没有定义destructor,那么只有在class内带的member object(或是class自己的base class)拥有destructor的情况下,编译器才会自动合成出一个来,否则,destructor会被视为不需要,也就不需要被合成(当然更不会被调用)。
必须使用成员初始化列表的情形:
1.当初始化一个reference member时;
2.当初始化一个const member时
3.当调用一个base class 的constructor,而它拥有一组参数时。
4.当调用一个member class的constructor,而它拥有一组参数时。
vptr在何时被初始化
在base class constructor调用操作之后,但是在程序员供应的代码或是member initialization list中所列出的member初始化操作之前。
constructor的执行算法通常如下:
1.在derived class constructor中,所有virtual base classes及上一层的base classes的constructor会被调用。
2. 上述完成之后,对象的vptr(s)被初始化,指向相关的virtual table(s).
3. 如果有member initialization list的话,将在constructor体内展开。这必须在vptr被设定之后才进行,以免有一个virtual member function被调用。
4. 最后执行程序员提供的代码。
这样看来很好理解:为什么构造函数中调用虚函数是调用这个构造函数所属类的函数,而不是像平常虚函数调用一样。此外,我们也知道了,如果在成员初始化列表中调用了虚函数,这与函数中调用虚函数一样。
虽然如此,还是非常不建议在构造函数中调用虚函数,因为对象尚未构造好,数据尚未初始化,会带来很多问题。
destructor被扩展的方式:
1.destructor的函数本身首先被执行。
2.如果class拥有member class objects,而后者拥有destructor,那么它们会以其声明顺序的相反顺序被执行。
3. 如果object内带一个vptr,则现在被重新设定,指向适当的base class的vritual table。
4.如果有任何直接的(上一层)nonvirtual base class拥有destructor,它们会以其声明顺序的相反顺序被调用。
5.如果有任何virtual base class 拥有destructor,而当前讨论的这个class是最尾端(most-derived)的class,那么它们会以其原来的构造顺序的相反顺序被调用。
为一个类重载new和delete时,尽管不必显示地使用static,但实际上仍是在创建static成员函数。
C++代码中调用C函数,需要加 extern "C".
单个函数,可以这样:
extern "C" void f1();
一组函数:
extern "C" {
void f2();
void f3();
}
待更新。。。