#include<iostream>
#include<string>
using namespace std;
class A
{
public:
    A()
    A(){data2=0;data2=0;}
    A(int a=0,int b=0){data1=a;data2=b;}
    void display();
private:
    int data1;
    int data2;
};
void A::display()
{
    cout<<data1<<endl;
    cout<<data2<<endl;
}
void main()
{
    A a1;
    A a2(1,2);
    a1.display();
    a2.display();
}
  编译后会出现错误是(用的VS2010)

  C++1>f:面向对象miao_9miao_912.cpp(8): error C2535: “A::A(void)”: 已经定义或声明成员函数
  1>         f:面向对象miao_9miao_912.cpp(7) : 参见“A::A”的声明
  1>f:面向对象miao_9miao_912.cpp(14): warning C4520: “A”: 指定了多个默认构造函数
  1>f:面向对象miao_9miao_912.cpp(22): error C2668: “A::A”: 对重载函数的调用不明确
  1>         f:面向对象miao_9miao_912.cpp(9): 可能是“A::A(int,int)”
  1>         f:面向对象miao_9miao_912.cpp(7): 或       “A::A(void)”

  现在解释下上面的错误出现的原因吧:首先要说的是“指定了多个默认构造函数”

  A()

  A(){data2=0;data2=0;}

  如上所说的这两个都是默认构造函数,而一个类只能调用一个默认构造函数(一定要注意带默认参数的构造函数也是默认构造函数!)

  在是

  对重载函数的调用不明确

  也是所说的二义性啊,因为编译器不知道调用哪个默认的构造函数啊!

  A a1;

  创建这个对象时调用默认构造函数时,两个默认构造函数都符合,所以编译器不知道调用哪个!只需要把A()删掉那么两个问题都解决了。

  现在在举个函数重载时二义性例子:


#include<iostream>
using namespace std;
int max(int a,int b);
int max(int a=0,int b=0,int c=0);  //函数重载
void main()
{
        inta=2;
        intb=3;
        cout<<max(a,b)<<endl;
}
int max(int a,int b)
{
        if(a>b)
               returna;
        else
               returnb;
}


  编译后报错如下(VS2010):

  C++1>  正在创建“Debugmiao_12.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
  1>ClCompile:
  1>  2.cpp
  1>f:面向对象miao_12miao_122.cpp(9): error C2668: “max”: 对重载函数的调用不明确
  1>         f:面向对象miao_12miao_122.cpp(4): 可能是“int max(int,int,int)”
  1>         f:面向对象miao_12miao_122.cpp(3): 或       “int max(int,int)”
  1>         f:visualstudiovcincludexutility(2078): 或       “const _Ty &std::max<int>(const _Ty&,const _Ty &)”
  1>         with

  “函数重载调用不明确”也是在调用max(a,b)时两个


int max(int a,int b);
int max(int a=0,int b=0,int c=0);  //函数重载


  在语法上调用都是合法的,所以才会出现调用不明确啊,对于int max(int a,int b)无可非议,调用他是合法的。而对于int max(int a=0,int b=0,int c=0)也是符合语法的,这是C++的默认参数效果,因为C++对于使用默认参数的函数是不一定传递函数的参数,也是说参数是可以省略的!至于怎么改不在赘述了,,,,

  说道这里,应该差不多了吧!呵呵,,还是那句老话,对于有不对之处,还望指出!