首先请教一下概念:比如现在定义了一个class叫Example,然后main()函数里先声明了Example A; 再Example B=A或者Example B(A)。
这里,“Example B=A”自然属于重载赋值操作符=,那么“Example B(A)”是否也属于重载赋值操作符=呢?看到网上有句话叫“当需要拷贝构造函数时,重载赋值操作符也是需要的;反之亦然。”——这个说法是否正确呢?
面试题1:
class Sc
{
public:
int x;
public:
Sc(int xx): x(xx) {}
Sc(const Sc&a) {x=a.x; x++;}
void operator = (const Sc &a1) {x=a1.x; x--;}
};
int main()
{
Sc a(4);
Sc b=a;
cout << b.x << endl;
return 0;
}
请问运行之后为什么b.x是5呢?
面试题2:
class String
{
public:
explicit String(char ch, int n=1) {}
String(const char *p) {}
private:
void operator = (const char*) {}
};
int main()
{
String x="aaa";
return 0;
}
面试官问:“这段程序显然有问题。那么问题出在哪里呢?explicit,还是constructor,还是operator=呢?”
恳请指点。谢谢大家!
Sc b=a;
调用拷贝构造函数, 所以b.x
初始化为4, 在,x++
得到 5.String x="aaa";
执行拷贝初始化, 而且拷贝构造函数的参数是const String &
. 所以会根据构造函数String(const char *p) {}
转换为对应的String
对象,在进行拷贝初始化.你可以这样测试: