美文网首页
GeekBand C++第一次课

GeekBand C++第一次课

作者: 清君侧 | 来源:发表于2016-03-01 10:09 被阅读67次

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

          本文链接:https://www.haomeiwen.com/subject/zimikttx.html