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