以下是本人觉得有必要记录的关于C++的基本常识
对象初始化方式:
传统的与C相同的方式: int num = 0;
构造函数语法: int num(0);
“以assignment运算符(=)进行初始化”这个操作是沿袭C语言而来,如果对象属于内建型,或者对象可以单一值加以初始化,这种方式就没有问题。例如以下的string class:
String sequence_name = “Fibbonacci”;
如果对象需要多个初始值,这种方式就没有办法完成任务了。以标准程序库中的复数类为例,它就需要两个初始值,一个实部和一个虚部。以下便是用来处理“多值初始化”的构造函数初始化语法(constructor initialization syntax):
#include <complex>
complex <double> purei(0, 7)
运算符的优先级
运算符优先级简列于下,位置在上者的优先级高于位置在下者,同一行的各种运算符具有相同的优先级,其评估次序视出现在表达式中的位置而定(从左至右)。
逻辑运算符 NOT
算术运算符 (*, /, %)
算术运算符 (+, -)
相对关联运算符 (<, >, <=, >=)
相对关联运算符 (==, !=)
逻辑运算符 AND
逻辑运算符 OR
赋值(assignment) 运算符
Array和Vector
定义 :
Array:
const int seq_size = 18;
int pell_seqp[seq_size];
Vector:
#include <vector>
Vector<int> pell_seq( seq_size);
初始化:
Array
Int elem_seq[] = {1, 2, 3, 5};
Vector
Vector<int> elem_seq( seq_size )
elem_seq[0] = 1;
elem_seq[1] = 2;
//…
指针
type_of_object_point_to * name_of_pointer_object
当我们调用一个函数时,会在内存中建立起一块特殊区域,称为“程序栈(program stack)”。这块特殊区域提供了每个函数参数的存储空间,它也提供函数所定义的每个对象的内存空间——我们称这些对象为local object(局部对象),一旦函数完成,这块内存就会被释放掉,或者说是从程序堆栈中被pop出来。
Pointer参数和reference参数二者之间更重要的差异
pointer可能(也可能不)指向某个实际对象,当我们提领pointer时,一定要先确定其值并非为0,至于reference则必定会代表某个对象,所以不须做次检查。
if (p) //判断p是否为NULL
{
cout << *p << endl
}
动态内存管理
不论local scope或file extent,对我们而言,都是由系统自动管理,第三种存储形式为dynamic extent(动态范围),其内存系由程序的自由空间(free store)配置而来,有时也称为heap memory(堆内存),此种内存必须由程序员自行管理,其配置是通过new表达式来达成的,而其释放则经由delete表达式完成。
new表达式的形式如下:
new Type;
此处的Type可为任意内建型别,也可以是程序指导的class型别,new表达式亦可写成:
new Type(initial_value);
例如:
int *pi;
pi = new int
便是先由heap配置出一个型别为int的对象,再将其地址赋值给pi,默认情形下,由heap配置而来的对象,均为经过初始化。
C++ 允许我们为所有参数或者部分参数设定为默认值。这样,当用户已单一参数调用函数式,不会出问题。
关于默认参数值得同,有两个不甚直观的规则,第一个规则是,默认值的决议(resolve)操作由最右边开始进行,如果我们为某个参数提供了默认值,那么这个参数右侧的所有参数都必须也具有默认参数。
第二个规则是,默认值只能够指定以此,可以在函数声明处,也可以在函数定义处,但是不能够在两个地方都指定。为了更高的可见度,我们通常将默认值置于函数声明处,而非定于出。(头文件)
局部静态对象(Local Static Object)
为了节省函数间的通信问题而降对象定义于file scope内永远是一种冒险,通常,file scope对象会打乱不同函数间的独立性,使他们难以理解。
局部静态对象与局部非静态对象不同的是,局部静态对象所处的内存空间,即使在不同的函数调用过程中,依然持续存在
inline只是对编译器提出的一种请求,编译器是否执行这项请求,需视编译器而定。