C++ 勘误

  列出一些可能会失误的地方   

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->来明确指定

原文地址:https://www.cnblogs.com/guopl/p/3466941.html