c++ 侯捷 面向对象

Posted by boyli on March 7, 2021

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抑制隐式转换