C++ primer (C++11)——1,2,3,4

来源:互联网 发布:java时间戳精确到毫秒 编辑:程序博客网 时间:2024/06/05 07:22

1.C++11初始化

int test{3};

int test= {13};

int test= {}; // 初始化为0

int test{}; // 初始化为0

新的初始化方式屏蔽了不同变量(包括对象)初始化方式的差异。


2.转义字符

当可以选择使用 数字转义序列 或 符号转义字符时, 优先使用 符号转移序列。 数字转移字符依赖于特定的编码(比如ASCII),而符号可以增强程序的灵活性和易读性。

例如,使用 ‘\b’代替 ‘\08’。


3.const

.const变量在声明时初始化,否则,其值将是随机且不可修改的。

const与#define相比的优势:(1)明确变量类型;(2)可以限制作用域;(3)适用于复杂类型,例如数组和结构体。


4.结构体初始化

struct inflatable
{
char name[20];
float volume;
double price;
};

inflatable duck {"Daphne", 0.12, 9.98}; //C++11中,可以省略‘=’ 

在编译器支持的前提下,结构体可以有string类型的成员。


5.new和delete,指针

int *ps = new int;

delete ps; //OK

delete ps; // C++标准中对多次释放是未定义的

int jugs = 5;

int * pi = &jugs;

delete pi; // 非法操作,pi指向的内存不是由new分配

int * pt = new int;

short * ps = new short [500];

delete [] pt; // 未定义

delete ps // 未定义

注:(1)不要使用delete释放非new分配的内存;(2)不要多一块内存多次delete;(3)new [x]与[] delete配对使用;(4)new 与 delete 配对使用;(5)delete 用于null 指针是安全的。


6.指针和数组的区别

(1)指针的值可以修改,数组名的值不可以修改;

pointername = pointername + 1; // 合法

arrayname = arrayname + 1; // 非法

(2)对数组名应用sizeof得到数组大小;对指针应用sizeof得到指针大小(即地址宽度);

int arr[20];

sizeof(arr);   // 返回20

int * pt;

sizeof(pt); //返回4,32位系统


7.指针与string

(1)一些编译器把string字面量作为只读的,修改string字面量会产生运行时错误;

(2)一些编译器只为相同的string字面量保存唯一一份拷贝。


当源字符串长度超过目标字符数组大小时,strnlen()不会自动为字符串添加结束符(‘\0’),需要自己手工添加。


8.自动存储、静态存储、动态存储

(1)自动存储:典型例子是自动变量。自动变量的作用域仅仅是其定义所在的块。自动变量存储在栈中。

(2)静态存储:静态存储用于存储在程序运行期间持续存在的变量。定义于函数外部或使用static关键字的变量以静态方式存储。

(3)动态存储(自由存储、堆):使用new分配的内存


9.vector 和 array(C++11)

(1)vector模板类:可以在运行时设置容量,可修改、添加和删除元素;使用动态存储;性能不及内建数组;

(2)array模板类:编译时决定大小;使用栈内存,与C中的内建数组性能相同;可以进行越界检查(有性能损失);



0 0
原创粉丝点击