- 修饰函数的const
- 修饰变量的const(参数传递)
- 返回引用
修饰函数的const
类里面的函数分为要 改变数据 和 不改变数据 两种,不会改变数据的函数,在加上 const。
class complex
{
public:
complex(double r=0, double i=0):re(r), im(i) {}
double real() const {return re;}
double imag() const {return im;}
private:
double re, im;
}
如果没有加const,在创建对象时可能会出现问题!!!
正常情况:
{
complex c1(2, 1);
cout << c1.real();
cout << c1.imag();
}
有问题的情况:
在创建对象的时候加了 const,则创建的这个对象是常量,函数创建者认为不能修改这个对象内的数据。此时如果在函数定义时没有加const,函数则告诉使用者“函数内部可能修改数据”,则发生了矛盾,编译器则不会通过。
{
const complex c1(2, 1);
cout << c1.real();
cout << c1.imag();
}
修饰变量的const(参数传递)
pass by value vs. pass by reference (to const)
pass by value:传递数据时,数据有多大就传多大,若某个数据有300个字节,则传递时就传300个字节。
因此,在C语言中,可以通过指针的方式,将参数的地址传递过去,指针只有4个字节,传递很快。
pass by reference:(引用)引用底层就是指针,传引用的速度相当于传指针的速度。
养成良好的习惯,传参数时尽量都传引用,不要传值!!!
class complex
{
public:
complex(double r=0, double i=0): re(r), im(i){}
//由于传递的是引用,那么在传过去之后可能会被修改,若不想被修改,则加一个const
complex& operator += (const complex&); //return by reference
double real() const {return re;} //return by value
double imag() const {return im;} //return by value
private:
double re, im;
friend complex& _doapl(complex*, const complex&);
}
{
complex c1(2, 1);
complex c2;
c2 += c1; //在执行+=操作的时候,由于传递引用,速度很快
cout << c2;
}
返回引用
return by value vs. return by reference (to const)
return by reference 的好处:传递者无需知道接收者是以reference形式接收。
返回值的传递也尽量用引用!!!(尽量的意思是,有的情况不能用引用)
可以返回引用的情况:
a 的值和 b的值相加后,结果存放在 a 里面,a 的空间是已存在的,因此可以 return by reference。
不可以返回引用的情况:
因为 a 和 b 相加后的结果不能放在 a 中,也不能放在 b 中,因此需要在函数内开辟一个空间 c 来保存结果,此时返回的就是 c 的值。因为在函数结束时,c 的空间就会被释放,因此不能 return by reference。
//可以返回引用的情况:
int& add(int* a, const int& b)
{
a += b;
return *a;
}
//不可以返回引用的情况:
int add(const int& a, const int& b)
{
int c;
c = a + b;
return c;
}



