1、const member function(常量成员函数)
class complex {
public:
complex(double r = 0, double i = 0) : re(r), im(i) {}
complex& operator += (const complex&);
double real() const {return re;} //不改变数据 成员函数后边加const 好的编码习惯!!!
double imag() const {return im;}
private:
double re, im;
friend complex& __doapl (complex*, const complex&);
};
常量成员函数有const的时候下边的代码没问题
{
complex c1(2, 1);
cout << c1.real();
cout << c1.imag();
}
但是没有const的时候,下边代码有问题
{
const complex c1(2, 1);
cout << c1.real();
cout << c1.imag();
}
const 表示我这个函数不会改变里面的变量, 如果不加const 就表示我这个函数有可能会改变你这个里面的值
当存在const complex c1(2, 1);时,就表示我这个c1不能改变2和1这两个值,而你的成员函数却告诉我有可能会改变里面的值,所以编译器会出错。
2、相同class 的各个objects互为友元
class complex {
public:
complex() {}
int func(const complex& param) {
return param.re + param.im;
}
private:
double re, im;
}
{
complex c1(2, 1);
complex c2;
c2.func(c1);
}
3、什么时候不能传引用?
函数返回值 比如 complex* ths已经存在,已经有了自己的空间 所以返回值可以传引用
但如果不是 += 而是 x = c1 + c2(c1,c2为参数),x是在函数体内开辟的新空间,但是函数已结束,就意味着x这个局部变量就会被释放掉,所以这个时候返回值不能传引用,否则就会变成野指针。
complex& add(complex* ths, const complex& r) {
ths->re += r.re;
ths->im += r.im;
return *ths;
}
传递者无需知道接收者是以reference形式接收
4、临时对象
complex c1(2, 1);
complex c2;
//下面三行为临时对象,作用域结束后生命周期就没了
complex();
complex(4, 5);
cout << complex(2);
5、explicit关键字
explicit抑制隐式转换