C++基础

在变量定义前加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();

待更新。。。

原文地址:https://www.cnblogs.com/freewater/p/2605170.html