《附录D》

C++入门

    可以在同一个.cpp文件中实现多个类,也可以把一个类的实现分散到多个.cpp文件中

     wKioL1UD-1OycQeZAADzjdjiyg0642.jpg

    

    int main(int argc, char *argv[])   //argc:argument count,argv:argument value

Argv[0]存放程序的名字,argv[1]argv[2]......argv[argc-1]存放命令行参数

头文件(header file将函数原型放到一个单独的文件中,在需要调用这个函数的所有编译单元中包含该文件。

形式:

  #ifndef  XXX_H
  #define  XXX_H
  ......
  #ENDIF

#include<XXX>:尖括号表明头文件XXX位于系统的标准位置

#includeXXX:在当前目录下查找头文件XXX

头文件不是编译单元,不会产生目标文件,只包含一些让不同编译单元能够相互联系的声明。

可执行程序 连接很多库

静态库:可直接放进可执行程序(就像目标文件一样)

动态库:(共享库/DLL) 位于用户机器的标准位置,在应用程序启动时自动加载

基本数据类型

内置类型的实例不会默认初始化。

QlonglongQChar

QDataStream类用于存储与平台无关的二进制数据

类划分为三段:publicprotectedprivate 没有定义段则默认为private

内联函数(inline)调用一个声明为内联函数的函数时,编译器只是简单的扩展其函数体,不会生成实际的函数调用==>(更快速)

只有非常简短的函数才应该实现为内联函数

C++没有为所有的类提供一个可以继承出来的一般类Object

纯虚函数 == “接口”

C++不允许在类定义中初始化成员变量

类变量、实例变量

每一个静态成员变量都必须定义在.cpp文件中

指针

堆(heap

栈(stack

悬摆指针(dangling pointer)   “智能”指针:QPointer<T>

类的常量指针只能用于调用常量成员函数

Qt中“写时复制”(copy on write

引用

C++中的引用存储一个对象的地址,与指针的不同在于:

1. 声明:使用“&”而不是“*”;

2. 必须初始化,后面不能再次被重新赋值;

3. 可直接访问与引用相关联的对象;

4. 不能为空(null

数组

std::memcpy()  可以复制一块内存中的数据

创建可变大小数组:

1. 动态分配该数组

2. 使用std::vector<T>

        #include<vector>
        std::vector<int> array(n);

3. 使用QtQVector<T>

        #include<QVector>
        QVector<int> array(n);

模板类:在类名字中包含<>的类

字符串

C++中,字符串的文字是以隐式“\0”结束符结尾的简单常量字符数组

QString

枚举

有时,枚举用于声明整型常量,这时通常忽略枚举的名字:

    Enum{
        Monday = 1;
    }

又有时,枚举用于表达选项的集合,用一个以2的幂次方为值的枚举常量来表示各个选项,每个选项通常被称为“标记”(flag),可以使用按位运算符“|”或“|=”来组合这些标记,可以用按位运算符“&”测试是否选中了某个标记。

类型别名

类型转换

Static_cast<T>() 将指向A的指针转换为指向B的指针,类B必须为类A的子类

Dynamic_cast<T>() 运行时类型信息(RTTIruntime type information)验证

Const_cast<T>() 添加/移出对指针或引用的const限定

Reinterpret_cast<T>() 将任意类型的指针或引用转换为任意的其他类型

数据类型 void * 可以存储任意类型的实例的地址

关键字explicit 用于禁用自动转换功能

运算符重载

值类型

  值类型(value type)、引用类型(reference type

  C++中所有类型都可用作“引用类型”

  如果要让某个C++类具有可复制性,必须保证类有一个复杂构造函数(copy constructor)和一个赋值运算符。在定义一个类时C++编译器会自动提供一个复制构造函数和一个赋值运算符,用于执行成员到成员的复制。

全局变量和全局函数

  未完待续。。。。