1.时钟类的完整程序
#include<iostream> using namespace std; class Clock{ public : void setTime(int newH=0,int newM=0,int newS=0);//设置函数的默认值,注意!在此处声明时设定后外部实现时就不用设置了 void showTime(); private: int hour,minute,second; }; //时钟类的具体实现 void Clock::setTime(int newH,int newM,int newS) { hour=newH; minute=newM; second=newS; } void Clock::showTime() { cout<<hour<<":"<<minute<<":"<<second<<endl; } //主函数 int main() { Clock myClock;//定义对象 cout<<"First time set and output:"<<endl; myClock.setTime();//设置时间为默认时间 myClock.showTime(); cout<<"Second time set and output:"<<endl; myClock.setTime(8,30,30); myClock.showTime(); return 0; }
2.真是……本来想给clock类加上构造函数和复制构造函数还有析构函数,结果,在构造函数这块出了问题,call of overloaded Clock is ambigious,说是Clock这个函数有二义性,导致无法重载
下面看代码:
#include<iostream> using namespace std; class Clock{ public : void setTime(int newH=0,int newM=0,int newS=0);//设置函数的默认值,注意!在此处声明时设定后外部实现时就不用设置了 void showTime(); Clock(int newH=0,int newM=0,int newS=0);//含参构造函数 Clock(); //无参构造函数 Clock(Clock& clockCopy);//复制构造函数 ~Clock(){}//内置的析构函数 private: int hour,minute,second; }; //时钟类的具体实现 Clock::Clock(int newH,int newM,int newS) { hour=newH; minute=newM; second=newS; } Clock::Clock() { hour=0; minute=0; second=0; } Clock::Clock(Clock& clockCopy)//复制构造函数是把传过来的对象的属性赋值给当前对象 { hour=clockCopy.hour; minute=clockCopy.minute; second=clockCopy.second; } void Clock::setTime(int newH,int newM,int newS) { hour=newH; minute=newM; second=newS; } void Clock::showTime() { cout<<hour<<":"<<minute<<":"<<second<<endl; } //主函数 int main() { Clock myClock;//定义对象 cout<<"First time set and output:"<<endl; myClock.setTime();//设置时间为默认时间 myClock.showTime(); cout<<"Second time set and output:"<<endl; myClock.setTime(8,30,30); myClock.showTime(); return 0; }
主要是这块:
当我把含参构造函数的参数都设置上默认值的时候,系统就会允许在调用这个函数时可以不加参数,这就跟无参构造函数冲突了
想要避免这种情况的话,可以把默认值含参构造函数的默认值去掉,改成Clock(int newH,int newM,int newS); 的形式
如果就是非得想给它设一个默认值且不想跟无参构造函数冲突的话,我个人给你出个法子,你可以加一个没用的变量,当然,你要保证这个没用的变量不会跟其他单参数构造哈三年冲突;Clock(int nouse,int newH=0,int newM=0,int newS=0);//虽然传进去一个变量,但是你函数实现时不用它就行了; 当然这只是针对某些情况下这样去做,一般没必要,值不当