在听了侯捷大师的课程之后,刚开始还不是很习惯,由于之前学习C语言印象很深,之前对于C++也只是了解。所以,听过C++课程之后,有一些知识点盲区,现总结如下:
1.C++语言中的reference与point有何区别?
refereence是基于面向对象而提出的概念。引用为对象起了另外一个名字,引用类型引用(refers to)另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中但是声明的变量名。引用,在大多数情况下,和指针很像,最根本的区别在于,引用是和对象绑定在一起的,而不能和字面值或某个表达式的计算结果绑定在一起,例如:
int &ival = 1.01;
double dval = 3.14;
int &revals = dval;
以上都是错误的引用。
2.传引用与传指针的区别,以及何时能传?
在这个问题上,侯老师讲的已经很详细了,首推形参传引用。本人在这里,再次说明一下。侯老师,只是简单的讲了形参如果是引用,则参数传递过程,十分类似C语言的传指针的过程。那么二者到底有什么本质的区别呢?
在C++ Prime,上是这样给出的,
指针形参例子:
void reset (int *ip)
{
*ip = 0;
ip = 0;
}
int i = 42; reset(&i);
传引用参数例子:
void reset (int& i)
{
i = 0;
}
int j =42 ; reset (j);
很显然,二者根本区别在于,实参的类型。如果是C语言中的指针,实参类型必须是指针类型,形参与实参类型必须相等,而在C++中形参是引用,实参是对象,当调用reset函数时,i绑定我们传入的实参对象 j,因此改变i也就是改变i所引起对象的值。
二者局限性在于:不要返回局部对象的引用或指针因为函数完成后,
它所引用的存储空间随之被释放掉,和成员函数不同(成员函数有点类似于C语言的全局函数),所以,函数的终止意味着局部变量的引用将指向不在有效的内存区域。
例如,课程中class complex
{
public:
complex (double r = 0, double i = 0): re (r), im (i) { }
complex& operator += (const complex&);
complex& operator -= (const complex&);
complex& operator *= (const complex&);
complex& operator /= (const complex&);
double real () const { return re; }
double imag () const { return im; }
private:
double re, im;
friend complex& __doapl (complex *, const complex&);
friend complex& __doami (complex *, const complex&);
friend complex& __doaml (complex *, const complex&);
};
inline complex&
complex::operator *= (const complex& r)
{
return __doaml (this, r);
}
//该函数,在类体中声明的返回值是reference,从而在类体外的内联函数中的,返回值也是reference(返回值是友元函数的返回值)。
但是像:
inline complex
operator + (const complex& x, const complex& y)
{
return complex (real (x) + real (y), imag (x) + imag (y));
}
//这样的返回值是个local object所以,不能传引用。(因为在括号内,进行了运算,运算结果是在函数体内生成的等价于:complex c1;c1.real()=x.real()+y.real();c1.imag()=x.imag()+y.image();return c1;)
网友评论