C++易错点总结

来源:互联网 发布:阿里云客服考试 编辑:程序博客网 时间:2024/06/07 08:33

1.下面这段代码考察变量的作用域问题。

#include<iostream>using namespace std;void other(){static int a = 2;static int b;int c = 10;a += 2;c += 5;cout<<"----other-----"<<endl;cout<<a<<" "<<b<<" "<<c<<endl;b = a;}int main(){static int a;int b= -10, c= 0;cout<<"----main-----"<<endl;cout<<a<<" "<<b<<" "<<c<<endl;c += 8;other();cout<<"----main-----"<<endl;cout<<a<<" "<<b<<" "<<c<<endl;other();return 0;}
答案如下:

----main-----
0 -10 0
----other-----
4 0 15
----main-----
0 -10 8
----other-----
6 4 15

考察点:

局部作用域中静态变量的特点是,它并不会随着每次函数调用而产生一个副本,也不会随着函数返回而失效。也就是说,当一个函数返回后,下一次再调用时,该变量还会保持上一回的值,即使发生了递归调用,也不会为该变量建立新的副本,该变量会在每次调用见共享。

解析:

第一次a=0,b=-10,c=0,之后调用other函数,因为a和b为静态局部变量,所以在other函数就有保持值的特点,这时,根据就近原则,a=4,b=0,c=15.

然后继续执行,发现a,b的改变都是在other中,而对main中的a,b没有影响,所以a,b值不变,c由于自加8,所以c=8.然后又进入other,因为a,b为局部静态变量,不会再每次进入相同函数时产生副本,所以进入时a=4,自加2,等于6,上次函数结束时b=a,所以b=4,这次再进入时b还是保持4不变,而c是动态局部变量,每次进入函数都要重新初始化,所以c=10,自加5等于15.所以a=6,b=4,c=15.


2.说明Arr类中,element元素返回一个引用对象的原因。

#include<iostream>#include<cstdio>#include<cassert>using namespace std;class Point{private:int x, y;public:Point():x(0), y(0){cout<<"default called"<<endl;}Point(int x, int y):x(x), y(y){cout<<"not default called"<<endl;}~Point(){cout<<"destructor called"<<endl;}int getx()const{return x;}int gety()const{return y;}void move(int newx, int newy){x = newx;y = newy;}};class Arr{private:Point *p;int size;public:Arr(int size):size(size){p = new Point[size];}~Arr(){cout<<"deleting"<<endl;delete []p;}Point &element(int index){assert(index >= 0 && index < size);return p[index];}};int main(){int count;cin>>count;Arr points(count);points.element(0).move(5, 0);points.element(1).move(5, 2);return 0;}
答案:

因为我们创建的points对象是一个在类内部由动态数组实现的对象,而我们对数组的操作无非就是取元素,改变元素,如果element不返回一个引用时,那么我们可以认为这个元素是只读的,我们无法通过赋值等途径改变这个元素(其实是一个对象)的值,而我们返回一个引用的话,就相当于取出元素本身,就可以对它进行正常的读写操作。这样才符合数组的性质。


3.浅复制和深复制

#include<iostream>using namespace std;class A{private:int len;char *str;public:A(int length, char *s){len = length;str = new char[length];strcpy(str, s);}A(const A &p) //浅复制就是注释掉自定义复制拷贝函数(试试看?){len = p.len;str = new char[p.len]; //深复制strcpy(str, p.str);}~A(){delete str;}void show(){cout<<str<<endl;}};int main(){A a(10, "hello");A b = a;b.show();return 0;}


4.看看下面这个代码怎么错了?

#include<iostream>using namespace std;#define MAX 255int main(){char p[MAX+1];unsigned char ch;for(ch=0;ch<=255;++ch){p[ch]=ch;cout<<ch<<"";}p[255]='\0';cout<<ch<<endl;}

错误在于ch<=255,这个条件。因为ch是unsigned char类型的,占据一个字节,所以最大值为255.当ch循环到255时候+1之后溢出,就变成0了。这样,就陷入了死循环。正确该法是ch<255.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 骑三轮车被拘留怎么办 在看守所想上诉怎么办 南京老人去世后怎么办 吸毒强戒两年家人该怎么办 犯人在监狱里病亡怎么办 父母去世监狱人怎么办 公司不续签合同怎么办 股票亏20个点后怎么办 摩托车给扣了怎么办 通知拘留跑了怎么办 假烟倒卖会怎么办 卖了40万假烟怎么办 刑事拘留15天了怎么办 治安传唤人不到怎么办 治安处罚有劣迹怎么办 学生怀孕了该怎么办 有病不能拘留那怎么办 拘留所不交伙食费怎么办 治安拘留不执行怎么办 释放证明书丢了怎么办 银行提前收贷款怎么办 存货周转天数高怎么办 欠款人没有财产怎么办 起诉后对方没钱怎么办 法院起诉人不到怎么办 治安拘留跑了怎么办 看守所里生病了怎么办 二审上诉被驳回怎么办 醉酒驾车取保候审以后怎么办 小案子证据不足怎么办 撞车不严重逃逸怎么办 被执行人没有财产执行怎么办 挖到人头了怎么办 取保保证金不退怎么办 被诬陷经济诈骗怎么办 醉驾刑事拘留后怎么办 被别人举报赌博怎么办 涉黄刑事拘留怎么办取保候审 换了车牌保险怎么办 车辆转让后保险怎么办 立案后警察不管怎么办