求助:请高手全面解释一下形参对象直接赋值规则
以下程序经上机检验,注释部分为错误语句,
- C/C++ code
#include <iostream>using namespace std;class B{public: B(int i=0,int j=0) {m=i;n=j;cout<<"Con "<<m<<','<<n<<endl;} void Print() const {cout<<m<<','<<n<<endl;} void out() {cout<<m*n<<endl;} ~B() {cout<<"Des "<<m<<','<<n<<endl;}private: int m,n;};void fun(const B& a,B b,B c) //(const B& a,B b,const B *c)、(const B& a,B b,B *c)、(B& a,B b,B c){ a.Print(); b.out(); c.Print();}void main(){ fun((5,7),(0),(9)); //fun((5,7),(),(9));构造函数已设置默认值了为什么不能有空()?}
为什么注释语句会错?然后较全面地解释一下这种不定义对象而直接给函数对象形参赋数值的规则,要注意些什么问题。
[解决办法]
1.临时对象的引用该用const&至于你用B *为什么有问题就不解释了
2.这个属于语法方面的错误了。空的你觉得编译器应该怎么理解你的意图呢。
[解决办法]
1. 作为参数时,临时对象的引用,必须用const修饰。就像一个类的拷贝构造函数的写法:
B(const B& a);
如果写成:
B(B& a);
那么B b = B(1, 2);这样就会出错。因为B(1, 2)产生的是一个临时对象。
2. 如果用B*作为形参,那么实参楼主会怎么写呢?
3. 构造函数已设置默认值了为什么不能有空()?
编译器不知道怎么获取第二个实参,因为()的含义有很多,因而无法转型。为了明确,可以这么写:
fun((5,7),B(),(9));