C++面向对象高级编程(上)笔记 Week1

GeekBand  by  494631002

     在学习过了C++面向对象高级编程(上)之后,在此,我总结一下在课堂中所学到的知识,和自己的一些看法;

一、C VS C++:

     C++是由C语言演化而来的一门面向对象的高级编程语言;这里,我想总结一下C和C++之间的区别;

     在C语言中,函数和数据是分开的,写好的这些函数用来处理数据。而由于C语言中没有提供关键字,所以这些数据一定是全局的;因此这样一来,每个函数都可以处理这些数据;

     而在C++中,有了class这个关键字,它能够把数据和需要处理这些数据的函数们都放在了一个class中,这样一来就不会让外界随便的去使用这些数据;换句话说,这样就有很好的封装性;另一方面,C++提供了更多的关键字供使用者来使用;

用一张图来概括:

C++面向对象高级编程(上)笔记 Week1_第1张图片

二、C++代码的一般格式:

      写好一个程序,就好比要写好一篇作文。通常,一个C++的代码包含有两个部分:声明部分和实现部分;

1.头文件:

       这里首先需要注意的就是防卫式声明,为什么需要防卫式声明?这是因为C++是面向对象的语言,这意味着我们的C++代码从整体布局上来看是在处理类的多重设计,需要考虑类与类之间的关系;

      如果你只接触过或者只写过小型的程序,可能并不会有太深的感触。可是有的时候,一个大型的程序如果不注意这一点就会很难受了;

      我们知道,#include指令是编译预处理,在一个程序的开头,我们要把标准库的头文件和自己写的一些头文件通过编译预处理放在开头;

      实际上,编译器通过这条指令只是将头文件“完全照搬”到你的源文件(后缀名是.cpp)之中;

C++面向对象高级编程(上)笔记 Week1_第2张图片

      当然,在头文件中,我们也可能去include别的头文件。这样的话,最终在你的源文件中,就可能出现重复include一个头文件的情况;

     请记住:在同一个编译单元里,同名的结构是不能被重复声明的!举个例子:

     这是个头文件,我定义了a = 10,头文件里面我并没有进行防卫式声明;


     在源文件中,我重复的定义一个a,编译是无法通过的,原因也注明了 :


     结论:防卫式声明很重要!

2.头文件的布局:

     主要是前置声明、类的声明、类的定义;

    a.类的声明:

     主要强调一下几点:

    1.重要的数据声明应该放在private关键字中,这样实现了封装性,外界不  可以轻易直接使用;构造函数和成员函数放在public之中;

    2.初始化列表(Initializer list):这是一个很重要的概念,注意格式;使用初始化列表这种格式,意味着仅仅只是将参数进行初始化。当然也可以不用初始化列表,直接在构造函数中对参数赋值。如果这样做的话,意味着放弃了初始化阶段,这样效率较差,我们应该养成好习惯,不采用赋值的方法。

    3.构造函数可以有多个重载;重载函数虽然名字是一样的,但是在编译器看来名字还是不一样。注意下面这样的重载是不行的:

C++面向对象高级编程(上)笔记 Week1_第3张图片

    这样做不行的原因是,当创建无参数的对象时,编译器不知道该调用哪个函数;因为创建无参对象时,这两个函数都是默认把参数设置为0,因此这两个函数都是可行的,冲突了,所以不行!

   4.在写函数的时候,要考虑清楚到底该不该使用关键字const:这个也是一个重点;我们在构思一个函数的时候,就应该能够想到这个函数传出的结果到底是不是一个固定不变的量了;如果是如下图,函数仅仅只是拿出数据,那么就应该加上const;

   如果该加const,而你没有加上,很可能会给使用该函数的人带来不便;例如:

C++面向对象高级编程(上)笔记 Week1_第4张图片

   若前面的函数没有加const,那么如果这样创建对象的时候就会报错;这是因为编译器发现创建了不可改变的对象,当在调用real函数时,发现竟然可以能改变参数;因此是矛盾的。

   5.参数的返回和传递问题:一个函数,可以接收(/返回)一个值或者一个引用;那么传哪一个这是我们应该思考的问题;

   通常来说,传递一个引用的效率更高,但是在有些情况下,你不得不去传值;

   如果一个变量是在函数中所定义的,并且我们也需要这个变量,而这时去返回这个变量的引用是不行的。因为函数一结束,这个局部变量就自动被销毁了,传引用就没有了意义,这时就只能够传值;相反,如果我们需要的这个变量的空间一直存在,那么就可以考虑用传引用来提高效率;

   6.所有的成员函数一定带着隐藏的this指针,通常,谁调用这个函数,谁就是this;this是一个特殊的指针,编译器自动把调用者的指针传给this;

   7.若想访问private中的数据成员,可以使用关键字friend;注意的是,相同class的各个objects互为friends;


b.类之外的函数定义:

    1.在类中定义过的函数,便自动成为了inline的候选人;这样一来,就可以在类之外把函数的具体实现写清楚了;此处应该要注意:在下图中,传递者(C1)无需知道接收者(图中底下那个函数)是以reference形式接收的;

C++面向对象高级编程(上)笔记 Week1_第5张图片

     另外,上面这个函数,返回的是*ths,是一个值;而在函数前面却写着该函数返回的是complex&,是一个引用;这样做是可以的;

  2.C++自定义类型的一些operator是可以被重载的,比如+,+=,++;

  3.C++的临时变量的产生一般和函数调用相关,这个知识点之前我还没有遇到过,还需要再多多思考一下;一个调用如果没有被一个左值接受,那么就可产生一个临时变量,这个变量的生命周期到下一行就没有了。

你可能感兴趣的:(C++面向对象高级编程(上)笔记 Week1)