GeekBand C++第一次课

在听了侯捷大师的课程之后,刚开始还不是很习惯,由于之前学习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;)

你可能感兴趣的:(GeekBand C++第一次课)