面试

面试题:

1.考虑边际问题(将字符串转换为数字,考虑不是数字的字符,负数)

2.考虑特殊情况  (得到链表的第k个数,都知道使用两个指针,但要考虑 k为0,链表的长度小于k的情况)

3.定义一个空的类型,没有任务成员变量和成员函数,求sizeof, 得到的结果是1。声明实例时,必须在内存中占一定的空间。

4.上面问题,如果加上构造函数和析构函数,还是不变,因为构造函数和析构函数只要知道函数地址即可。

5. 上面问题,如果析构函数为虚函数, 那就不一样了,一旦是虚函数,就会为该类型生成虚函数表,并在该实例中添加一个指向虚函数的指针。在32位电脑上上是4字节的空间,在64位的机器上是8字节

6.

#include <iostream>

using namespace std;

class A
{

    private: value;
    public:
    A(int n) {value=n;}
    A(A other) {value=other.value;}
    void print()
    {
        cout<<value<<endl;
    }
}
int main()
{
    A a=10;
    A b=a;
    b.print();
    return 0;

}

  编译错误

因为复制构造函数A(A other) 传入的参数是A的一个实参,是值传递,把形参复制到实参会调用复制构造函数,会在复制构造函数内调用复制构造函数,就会形成递归条用而导致栈溢出。所以不允许复制构造函数传值参数,改为A(const A & other)

7. 赋值运算符函数:

定义一个赋值运算符函数: 返回一个自身的引用,才允许连续赋值。释放自身已有的内存。

class CMyString
{
    
    public: 
    CMyString (char * pData=nullptr);
    CMyString(const CMyString  & str);
    ~CMyString(void);
    private:
    char * m_pData;
}
CMyString & CMyString::operator=(const CMyString & str)
{
    
    if(this==&str)
    return * this;
    delete[]m_pData;
    m_pData=nullptr;
    m_pData=new char [strlen(str.m_pData)+1];
    strcpy(m_pData,str.M_pData);
    return * this;
    }
原文地址:https://www.cnblogs.com/fanhaha/p/7666123.html