首页 > 编程语言 > 详细

C/C++ 面试经典基础题剖析

时间:2014-02-19 13:54:01      阅读:456      评论:0      收藏:0      [点我收藏+]

编写类String的构造函数、析构函数和赋值函数 

class String 

{ 

        public: 

            String(Const char *str = NULL);//普通构造函数 

            String(const String &other);    //拷由构造函数 

            ~String(void);    //析构函数 

            String &operate = (const String &other);//赋值函数 

        private: 

            char *m_data;//用于保存字符串 

}; 

编写如下:

//String的析构函数 

String::~String(void) 

{ 

        delete[] m_data;//由于m_data是内部数据类型,也可以写成delete m_data; 

} 

//String的普通构造函数 

String::String(const char *str) 

{ 

        If(str == NULL) 

        { 

            m_data = new char[1]; 

            *m_data = ‘\0′; 

} 

else 

{ 

    int length = strlen(str); 

    m_data = new char[length + 1]; 

    strcpy(m_data,str); 

} 

} 

 

//拷贝构造函数 

String::String(const String &other) 

{ 

        int length = strlen(other.m_data); 

        m_data = new char[length + 1]; 

        strcpy(m_data,other.m_data); 

} 

//赋值函数 

 

String&String::operate=(const String&other) 

{ 

        //1.检查自赋值 

        If(this == &other)\ 

            return *this; 

        //2.释放原有的内存资源 

        Delete[] m_data; 

        //3.分配新的内存资源,并复制内容 

        int length = strlen(other.m_data); 

        m_data = new char[length+1]; 

        strcpy(m_data,other.m_data); 

        return *this; 


2  下面输出什么



main()
{
        int a[5] = {1,2,3,4,5};
        int *ptr = (int *)(&a+1);
        printf(“%d,%d”,*(a+1),*(ptr-1));
} 

答案:输出:2,5 

剖析:
  1. *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5;

    &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)

    int *ptr = (int *)(&a+1);则ptr实际是&(a[5]),也就是a+5

    原因如下:

    &a是数组指针,其类型为int(*)[5];

    而指针加1要根据指针类型加一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加5*sizeof(int)

    所以ptr实际是a[5]

    但是ptr与(&a+1)类型是不一样的(这点很重要)

    所以ptr-1只会减去sizeof(int*)

    a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].  




C/C++ 面试经典基础题剖析

原文:http://blog.csdn.net/u010236550/article/details/19418317

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!