C++易错题总结
来源:互联网 发布:js怎么把数字变成汉字 编辑:程序博客网 时间:2024/06/03 22:52
持续更新中…
1.enum string{ x1, x2, x3=10, x4, x5, } x;
函数外部问x等于什么?
如果是函数外定义那么是0
如果是函数内定义,那么是随机值,因为没有初始化
2.char str[] = "glad to test something";char *p = str;p++;int *p1 = reinterpret_cast<int *>(p);p1++;p = reinterpret_cast<char *>(p1); printf("result is %s\n", p);result is glad to test somethingresult is ad to test somethingresult is test somethingresult is to test something
该题的关键是要认清楚强制类型转换后指针的类型。
p的类型为char *,p++后p指向str数组的第2个元素即字母“l”的位置。
p1的类型为int *,p1++后p1指向的位置增加4个字节,指向str数组中的第6个元素即字母“t”的位置。
因此最后p的内容为“to test something”。
3.设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为?C c;void main(){ A*pa=new A(); B b; static D d; delete pa;}
A B C D
A B D C
A C D B
A C B D
首先一个个的分析:
对于类A, 是建立在堆上的对象指针pa, 手动释放
对于类B, 是建立在栈上的对象b,main函数结束就释放
对类C ,在静态存储区创建了一个对象c ,程序结束时候释放
对类D,也是在静态存储区建立对象d,但是局部变量,程序结束时候释放.
析构函数调用顺序:
先调用A的析构,因为delete pa . A
再释放栈上的对象b, B
关键看CD的顺序.
c是全局对象,对它的初始化是在main函数之前,所以析构时候要放在最后.
也就是先析构d ,然后再析构c
4.若char是一字节,int是4字节,指针类型是4字节,代码如下:class CTest{ public: CTest():m_chData(‘\0’),m_nData(0) { } virtual void mem_fun(){} private: char m_chData; int m_nData; static char s_chData;};char CTest::s_chData=’\0’;问:(1)若按4字节对齐sizeof(CTest)的值是多少?(2)若按1字节对齐sizeof(CTest)的值是多少?请选择正确的答案。
若按4字节对齐sizeof(CTest)的值是12;
若按1字节对齐sizeof(CTest)的值是9
解释:
在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。
如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间
虚函数因为存在一个虚函数表,需要4个字节,数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。
sizeof的本质是得到某个类型的大小,确切的来说就是当创建这个类型的一个对象(或变量)的时候,需要为它分配的空间的大小。而类也可以理解为类似于int、float这样的一种类型,当类中出现static成员变量的时候,static成员变量是存储在静态区当中的,它是一个共享的量,因此,在为这个类创建一个实例对象的时候,是无需再为static成员变量分配空间的,所以,这个类的实例对象所需要分配的空间是要排除static成员变量的,于是,当sizeof计算类的大小的时候会忽略static成员变量的大小
5.#include<stdio.h>char *myString(){ char buffer[6] = {0}; char *s = "Hello World!"; for (int i = 0; i < sizeof(buffer) - 1; i++) { buffer[i] = *(s + i); } return buffer;}int main(int argc, char **argv){ printf("%s\n", myString()); return 0;}
函数char *myString()中没有使用new或者malloc分配内存,所有buffer数组的内存区域在栈区
随着char *myString()的结束,栈区内存释放,字符数组也就不存在了,所以会产生野指针,输出结果未知
- c语言易错题总结
- C总结
- C 总结
- 【C++】总结
- 【C#】总结
- C---------------------总结
- c总结
- C#--总结
- c 总结
- c总结
- C总结
- C 总结
- 【总结】C语言总结!!!
- 数据类型总结 (C++,C#)
- [C语言]C总结
- 数据类型总结(C++,C#)
- 【C/C++】排序总结
- C/C++/VC随机数总结
- usaco1.4.2 Mother's Milk
- C语言字符与ASCII码的互转,字符和整型的转换
- 120欧姆 50欧姆
- 总结【代码重构】:Backbone.js做一个点击链接,跳过加载图片后即可跳转到效果图片的例子
- Java学习笔记第十天:1_形式参数和返回值的问题深入研究
- C++易错题总结
- leetcode note--leetcode 167 Two Sum II - Input array is sorted
- yarn描述
- charles 教程0x01-抓包并Mock数据
- 使用lua扩展nginx的功能
- 一个处理树的工具类
- Android学习笔记(十二)传感器
- 在Linux上使用迅雷解决方案xware
- unable to execute command:Segmentation fault: 11 linker command failed due to signal