关于字符和字符串:
- c中只有字符数组来存储字符串,需要先声明长度;c++中通过string类型来定义字符串。
- c++中string类型的字符串以'\0'来结尾,计算长度用strlen时不包含结尾的字符,用sizeof()函数时包含结尾字符 ---错误 更改为 计算字符串长度有 string的成员变量 size、length、capacity,表示当前字符串的包含的元素个数,不包含结尾的\0,sizeof()函数来计算一个数据类型的大小 比如char 占用 1个字符,string占用8个字符 int占用4个字符(在32位操作系统)
- 对c++使用memcpy、memset、memcmp函数时注意操作对象要为POD,即c风格的struct;
c++中函数参数传递的3种方式:
- 值传递。分三步
- 在堆栈上创建临时对象(如果对象为类类型,会调用类的构造函数)
- 函数执行,操作临时对象
- 函数结束,释放掉临时对象(如果临时对象为类类型,会调用析构函数)
- 引用传递,即使形参是类类型,也不会调用构造和析构函数。分三步
- 在堆栈上创建引用形参,普通形参副本和局部变量
- 函数执行
- 函数退出,释放副本和局部变量
- 指针传递,创建的形参是指针,所以也不会调用构造函数和析构函数。
- 在堆栈上创建指针形参,普通形参副本和局部变量
- 函数执行
- 函数退出,释放副本和局部变量
三种方式中,值传递的执行效率和安全性高点。但对于函数形参的为较大的类数组时,则构造和析构的次数就较大了。
c++中的宏引入原因:函数调用前要保存当前函数执行的现场(即上下文环境),函数执行结束又要恢复执行前的现场,这样会有一定的时间和空间上的开销。而宏只在预处理时把宏代码展开,不需要保存现场和恢复现场。
宏不能访问对象的私有成员;且宏容易引起二义性。
函数圈复杂度:统计一个函数有多少个分支(if,while,for等)