今日碰到一个问题,上来向大家请教。为了简单一点,我举一个例子,
我自己写了两个类,一个叫A,一个叫B
然后来测试B类的函数:class A{...};//详细内容略class B
{
public:
  B();//函数1:无参构造
  ~B();
  B(const A &a);//函数2:以A实例为参数构造
  B& operator =(const A &a);//函数3:以A实例为右值赋值
  ...//其它略
};
...//函数略
以上这样的类设计,应该可以完成以下的操作:
B b1;//语句1:调用函数1
A a;
B b2(a);//语句2:调用函数2
b1=a;//语句3:调用函数3现在我发现,即使我删除函数3,
编译照样通过,运行有问题,
问题不算大,程序没有异常、也没有终止,
只是跳过了语句3及后面的所有语句。单步跟踪调试,发现语句3改为调用了函数2,
(本该调用的函数3被删除了)
但是随后出错了,错误有两个:
一是栈溢出,二是Access Violation。经过以上测试,至少说明两个问题:
一、这个程序不应该编辑通过的,VC++6照编不误,调错函数,
二、正常执行时马大哈似地略过语句,调试却报错。大家对此是怎样理解的?
请大家说说。

解决方案 »

  1.   

    楼上此言差矣,
    对于class B来说,
    B& B::operator =(const B& other);会自动提供一个
    B& B::operator =(const A& a);不会自动提供
      

  2.   

    目前最大的怀疑是:b1 = a;这一句是这样运行的:
    首先调用B::B(const A &a);来构造一个临时的B对象,
    然后调用B& B::operator =(B &other);来赋值
    这个赋值函数是的的确确会自动产生的。
    但是,我的B::B(const A &a);函数不会产生溢出,
    错误出在什么地方,也就不知道了。