列出一些可能会失误的地方
const string * strp 是 指向不可变字符串的一个指针,
string *const strp 是指向字符串,但该指针为不可变。
const string* const p 是指向不可变字符串的不可变指针
typedef string * ms;
const ms strp ;实际应该是string *const strp ;因为const描述的是string 指针类型.
C++不允许定义长度为0 的数组变量,但可以调用new 动态的创建长度为0的数组;
例如 :
int i[0];// 不合法
new int[0];//OK
虽然可以动态创建长度为0的数组,但是不允许对该数组进行解引用,因为它没有什么可用的值
但可以进行比较操作,和加减,或者减去本身,结果为0值。
测试C风格的字符串长度需要注意需要加1
const char * cstr="leak";
const size_t len=strlen(cstr)+1; //因为字符串最后' '来作为结尾,而这个空字符占用1字节。
char * c=new char[len];
C++中操作符
typeid
sizeof
new
delete
以上4个容易误解,以上4个不是函数,是C++的操作符。和* & 之类的是一个类别。
安全释放内存空间
例如:
int *p =new int();
delete p;
p=0; //注意这里置空指针,防止悬垂指针导致的程序的不稳定性
指向const 对象的指针可以指向非const对象
但指向非const对象的指针不可以指向const对象
函数传入数组时,并不会检查数组的长度,只会检查传入的参数是否为指针,指针类型是否匹配。
如果函数的数组形参是引用形参的话,将会检查数组长度
例如: fct(int (&narr) [10]) 引用必须带括号,因为下标操作符的优先级高于引用.
函数指针声明时必须用()把变量名称括起来。(*fucRef)
例如
bool (*fucRef)(int arg);
函数指针形参要求精确匹配,不存在转换
对函数指针赋值时可以不用&符 (取地址)
fucRef = fct;
等价
fucRef = &fct;
调用函数指针时可以不用*符(解引用)
fucRef(1);
(*fucRef)(1);
vector<string> v;
v[0]; //这里会报runtime error;
v.at(0); //用at调用取值的话,会throw out_of_range Execption;
在函数中访问全局同名变量,请用:: 作用域操作符来指定 例如 ::global
访问被局部变量覆盖的类变量,用this->来明确指定