《2017年11月26日》【连续047天】
标题:复制构造函数和递归例题(波兰表达式)的学习;
内容:A.那道拨钟问题还是没什么思路;
B.复制构造函数:
X::X(X&)或X::X(const X&),
如果没有定义复制构造函数,编译器自动生成默认复制构造函数,它会完成复制功能;
如果自己定义复制构造函数,则默认的不会存在;
不允许形如X::X(X)的构造函数;
1)当用一个对象去初始化同类的另一个对象;
Complex c2(c1);
2)如果某函数有一个参数是类A的对象,那么调用该函数时,类A的复制构造函数将被调用。
class A
{
public:
A(){ };
A(A&a){
cout<<"COPY constructor called"<<endl;
}
};
void Func(A a1){ }
int main()
{
A a2;
Func(a2);
return 0;
}
程序输出:COPY constructor called ;
3)如果函数的返回值是类A的对象时,则函数返回时,
A的复制构造函数被调用;(这里有点问题)//已解决,是因为devC++对复制构造函数的优化;
但对象间赋值并不导致复制构造函数被调用;
当我们使用常量引用参数时,void fun(CMclass obj_){ cout<< "fun" <<endl;}
可以使用 CM有class&作为参数,来防止调用复制构造函数,来减少开销;
要确保实参的值在函数中不被改变,可加const;
C.波兰(前置)表达式:
2+3 -> + 2 3;(2+3)*4 -> * + 2 3 4;
输入:输入一行,运算符和运算数之间都用空格分隔,运算数是浮点数;
输出:
表达式的值;
波兰表达式定义:
1)一个数是一个波兰表达式,值为该数;
2)”运算符 波兰表达式 波兰表达式“是波兰表达式,值为两个波兰表达式的值运算的结果;
例:
#include<cstdlib>
using namespace std;
double exp(){
char s[20]; // 假设读入的全部小于20;
cin>>s;
switch(s[0]){
case '*': return exp()*exp();
case '/': return exp()/exp();
case '+': return exp()+exp();
case '-': return exp()-exp();
default: return atof(s);
break;
}
}
int main()
{
cout<<exp()<<endl;
return 0;
}
明日计划:析构函数;