• 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
Copyright © 2020-2023  润新知