【C++】经典且易错的题
1.以下不是double compare(int,int)的重载函数的是( )A.int compare(double,double)B.double compare(double,double)C.double compare(double,int)D.int compare(int,int)A.重载必须是参数列表有所不同(包括个数和类型)所以参数类型不同构成重载 B.参数类型不同构成重载 C.参数类型不同构成重载D.函数重载不能依靠返回值的不同来构成重载因为调用时无法根据参数列表确定调用哪个重载函数故错误2.关于c的inline关键字,以下说法正确的是( )A.使用inline关键字的函数会被编译器在调用处展开B.头文件中可以包含inline函数的声明C.可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数D.递归函数也都可以成为inline函数A.不一定因为inline只是一种建议需要看此函数是否能够成为内联函数B. inline函数不支持声明和定义分离开因为编译器一旦将一个函数作为内联函数处理就会在调用位置展开即该函数是没有地址的也不能在其他源文件中调用故一般都是直接在源文件中定义内联函数的C.inline函数会在调用的地方展开所以符号表中不会有inline函数的符号名不存在链接冲突。D.比较长的函数递归函数就算定义为inline也会被编译器忽略故错误3.下面描述错误的是( )A.this指针是非静态成员函数的隐含形参.B.每个非静态的成员函数都有一个this指针.C.this指针是存在对象里面的.D.this指针可以为空A.静态成员函数没有this指针只有非静态成员函数才有且为隐藏指针B.非静态成员函数的第一个参数就是隐藏的this指针C.对象的内存布局只包含非静态成员变量以及可能的虚函数表指针等不包含成员函数代码也不包含 this 指针故错误。补充成员函数是代码段中的公共代码同一个类的所有对象共享同一份函数体。this 指针的作用是在函数执行时告诉函数当前操作的是哪个对象的成员变量。D.单纯的对this赋空是不可以的不过可以强转直接赋空不过一般不进行这样的操作4.设已经有A,B,C,D4个类的定义程序中A,B,C,D析构函数调用顺序为 C c;intmain(){A a;B b;staticD d;return0}A.D B A CB.B A D CC.C D B AD.A B D C分析:1、类的析构函数调用一般按照构造函数调用的相反顺序进行调用但是要注意static对象的存在 因为static改变了对象的生存作用域需要等待程序结束时才会析构释放对象2、全局对象先于局部对象进行构造3、局部对象按照出现的顺序进行构造无论是否为static4、所以构造的顺序为 c a b d5、析构的顺序按照构造的相反顺序析构只需注意static改变对象的生存作用域之后会放在局部对象之后进行析构6、因此析构顺序为B A D C5.变量所在哪个内存区域以及变量所占空间大小是多少32位intglobalVar1;staticintstaticGlobalVar1;voidTest(){staticintstaticVar1;intlocalVar1;intnum1[10]{1,2,3,4};charchar2[]abcd;constchar*pChar3abcd;int*ptr1(int*)malloc(sizeof(int)*4);int*ptr2(int*)calloc(4,sizeof(int));int*ptr3(int*)realloc(ptr2,sizeof(int)*4);free(ptr1);free(ptr3);}选择题选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里____ staticGlobalVar在哪里____staticVar在哪里____ localVar在哪里____num1 在哪里____char2在哪里____ *char2在哪里___pChar3在哪里____ *pChar3在哪里____ptr1在哪里____ *ptr1在哪里____填空题sizeof(num1) ____;sizeof(char2) ____; strlen(char2) ____;sizeof(pChar3) ____; strlen(pChar3) ____;sizeof(ptr1) ____;选择题globalVar在哪里CstaticGlobalVar在哪里CstaticVar在哪里ClocalVar在哪里Anum1 在哪里A分析:globalVar全局变量在数据段 staticGlobalVar静态全局变量在静态区staticVar静态局部变量在静态区 localVar局部变量在栈区num1局部变量在栈区char2在哪里A*char2在哪里ApChar3在哪里A*pChar3在哪里Dptr1在哪里A*ptr1在哪里B分析: char2局部变量在栈区 char2是一个数组把后面常量串拷贝过来到数组中数组在栈上所以*char2在栈上pChar3局部变量在栈区 *pChar3得到的是字符串常量字符在代码段 ptr1局部变量在栈区*ptr1得到的是动态申请空间的数据在堆区填空题sizeof(num1) 40;//数组大小,10个整形数据一共40字节sizeof(char2) 5;//包括\0的空间strlen(char2) 4;//不包括\0的长度sizeof(pChar3) 4;//pChar3为指针strlen(pChar3) 4;//字符串“abcd”的长度不包括\0的长度sizeof(ptr1) 4;//ptr1是指针6.下面有关c内存分配堆栈说法错误的是( )A.对于栈来讲是由编译器自动管理无需我们手工控制对于堆来说释放工作由程序员控制B. 对于栈来讲生长方向是向下的也就是向着内存地址减小的方向对于堆来讲它的生长方向是向上的是向着内存地址增加的方向增长C.对于堆来讲频繁的 new/delete 势必会造成内存空间的不连续从而造成大量的碎片使程序效率降低。对于栈来讲则不会存在这个问题D.一般来讲在 32 位系统下堆内存可以达到4G的空间但是对于栈来讲一般都是有一定的空间大小的A.栈区主要存在局部变量和函数参数其空间的管理由编译器自动完成无需手动控制堆区是自己申请的空间在不需 要时需要手动释放B.栈区先定义的变量放到栈底地址高后定义的变量放到栈顶地址低因此是向下生长的堆区则相反C.频繁的申请空间和释放空间容易造成内存碎片甚至内存泄漏栈区由于是自动管理不存在此问题D.32位系统下最大的访问内存空间为4G,所以不可能把所有的内存空间当做堆内存使用故错误7.C中关于堆和栈的说法哪个是错误的:( )A.堆的大小仅受操作系统的限制栈的大小一般较小B.在堆上频繁的调用new/delete容易产生内存碎片栈没有这个问题C.堆和栈都可以静态分配D.堆和栈都可以动态分配A.堆大小受限于操作系统而栈空间一般有系统直接分配B.频繁的申请空间和释放空间容易造成内存碎片甚至内存泄漏栈区由于是自动管理不存在此问题C.堆无法静态分配只能动态分配D.栈可以通过函数_alloca进行动态分配不过注意所分配空间不能通过free或delete进行释放ClassA*pclassanewClassA[5];deletepclassa;c语言中类ClassA的构造函数和析构函数的执行次数分别为( )A.5,1B.1,1C.5,5D.程序可能崩溃A.申请对象数组会调用构造函数5次delete由于没有使用[]此时只会调用一次析构函数但往往会引发程序崩溃B.构造函数会调用5次C.析构函数此时只会调用1次要想完整释放数组空间需要使用[]D.正确9.函数参数使用的空间是在中申请的malloc或new是在中申请空间的A.堆栈B.栈堆C.栈 栈D.堆堆参数在栈空间存放malloc或new申请的空间为堆区10.设已经有A,B,C,D4个类的定义程序中A,B,C,D析构函数调用顺序为 C c;voidmain(){A*panewA();B b;staticD d;deletepa;}A.A B C DB.A B D CC.A C D BD.A C B D首先手动释放pa 所以会先调用A的析构函数其次会跟定义相反的顺序释放局部对象这里只有b就释放b再释放静态局部对象d再释放全局对象c11.使用 char* p new char[100]申请一段内存然后使用delete p释放有什么问题( )A.会有内存泄露B.不会有内存泄露但不建议用C.编译就会报错必须使用delete []pD.编译没问题运行会直接崩溃A.对于内置类型此时delete就相当于free因此不会造成内存泄漏B.正确C.编译不会报错建议针对数组释放使用delete[],如果是自定义类型不使用方括号就会运行时错误D.对于内置类型程序不会崩溃但不建议这样使用12.计算一年中的第几天题目链接//第一种#includeiostreamusingnamespacestd;/* *思路 * 1. 通过枚举每个月的1号是这一年的第几天从而进行累加求和即可其中注意闰年的处理 */intmain(){intyear,month,day;while(cinyearmonthday){intmonthDays[13]{0,31,59,90,120,151,181,212,243,273,304,334,365};intndaymonthDays[month-1]day;if(month2((year%40year%100!0)||year%4000)){nday1;}coutndayendl;}return0;}//第二种#includeiostreamusingnamespacestd;boolIsLeapYear(inty){return((y%40y%100!0)||(y%4000));}intmain(){inty,m,d;while(cinymd){intday0;intMonthDay[13]{-1,31,28,31,30,31,30,31,31,30,31,30,31};if(IsLeapYear(y))MonthDay[2]29;for(inti1;im;i){dayMonthDay[i];}coutdaydendl;}return0;}13.日期差值题目链接#includeiostreamusingnamespacestd;/* *思路 * 1. 分别求出每一个日期与0000年0月1日距离的天数 * 2. 两个距离天数相减即可得到两个日期相差的天数 *///平年从1月到n月的天数intmon[12]{0,31,59,90,120,151,181,212,243,273,304,334};//给出年月日计算距离0000年0月1日的天数和intCountDay(inty,intm,intd){// 计算0-y年的天数intyearDayy*365y/4-y/100y/400;// 计算到0-m月的天数intmonthDaymon[m-1];if(m2((y%40y%100!0)||y%4000))monthDay1;returnyearDaymonthDayd;}intmain(){intyear1,month1,day1;scanf(%4d%2d%2d,year1,month1,day1);intn1CountDay(year1,month1,day1);intyear2,month2,day2;scanf(%4d%2d%2d,year2,month2,day2);intn2CountDay(year2,month2,day2);coutabs(n1-n2)1endl;}