面试题:
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; }