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是一字节,int4字节,指针类型是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()的结束,栈区内存释放,字符数组也就不存在了,所以会产生野指针,输出结果未知

0 0
原创粉丝点击