美文网首页
C++面向对象高级编程(上)笔记一(Boolan)

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

作者: CarmenS233 | 来源:发表于2018-01-08 21:41 被阅读0次

    1.C++编程简介

    应具备的基础

    曾经学过某种procedural language(C语言最佳)

           变量(variables)

           类型(types):int,float,char,struct ...

           作用域(scope)

           循环(loops):while,for

           流程控制:if-else,switch-case

    知道如何建立一个可运行程序

    学习目标

    培养正规的、大气的编程习惯

    Object Based(基于对象)

    以良好的方式编写C++ class

           class without pointer members——Complex

           class with pointer members——String

    Object Oriented(面向对象)

    学习classes之间的关系——继承(inheritance)、复合(composition)、委托(delegation)

    将获得的代码

    complex.h

    comlex-text.cpp

    string.h

    string-text.cpp

    oop-demo.h

    oop-text.cpp

    C++的历史

    B语言(1969)

    C语言(1972)

    C++语言(1983)

    (new C → C with Class → C++)

    Java语言

    C#语言

    C++演化

    C++ 98 (1.0 )

    C++ 03 (TR1)

    C++ 11 (2.0)

    C++ 14

    C++包含两个内容

    Bibliography

    语言部分

           C++ Primer

           The C++ Programming Language

    专家经验

           Effective C++ Third Edition

    标准库

           The C++ Standard Library

           STL源码剖析

    2.头文件与类的声明

    C vs C++,关于数据和函数

    C:数据,函数,函数用来处理数据。数据是全局的,各个函数都可以处理这些数据。

    C++:数据和处理它的函数包在一起,称为class。类似于C中的struct,多了更多的特性,提供了很多关键字让我们去使用这些特性。

    带指针:string

    不带指针:complex

    Object Based (基于对象) vs. Object Oriented (面向对象)

    Object Based :面对的是单一的 class 的设计

    Object Oriented:面对的是多重classes的设计,classes和classes之间的关系

    C++ 程序代码基本形式


    Output, C++ vs. C

                想象cout是你的屏幕


    Header (头文件)中的防卫式声明

    如果不曾定义过complex,则进行定义。

    Header头文件的布局



    class 的声明(declaration)

    class head+class body

    class template 模板简介

    为了避免重复定义数据类型

    3. 构造函数

    一些函数在class body里直接定义,一些只是声明

    inline (内联)函数

    有宏的特性

    是否能当做inline要看编译器的能力,若函数太复杂可能没有办法inline。

    在body外定义的函数,前面要加inline

    access level (访问级别)

    数据部分放在private,函数部分放在public

    还有第三种:protected

    private和public段落可以任意交错出现,想到哪里写哪里

    错误之处在于,直接取private里的data。

    constructor (ctor 构造函数)

    构造函数不需要定义返回类型

    注意图中的绿色箭头,不要放弃构造函数的初始化功能

    否则效率会差很多

    对应有一个叫做析构函数,不带指针的类多半不用写析构函数。

    ctor(构造函数)可以有很多个-overloading(重载)

    两个函数名看似都叫real,但实际在编译器中进行了编码,名称并不相同。

    注意下面的real函数没有加const.

    函数重载常常发生在构造函数身上。

    第二个重载的构造函数若与第一个冲突,则不允许同时存在。

    constructor(ctor,构造函数)被放在private区

    不可以被外界调用

    只能被调用一份

    4. 参数传递与返回值

    const member functions (常量成员函数)

    容易忽略的点:const修饰函数,在小括号后加 const ,意思是这个函数不会改变数据

    const还可能出现在对象或者变量的前面,意思是这个对象或者变量不变。

    对于右侧的调用,如果上面public中没有写const,则会出现编译错误。

    要考虑周全

    参数传递:pass by value vs. pass by reference(to const)

    by value :无任何特殊符号,字节整包都传过去

    by reference(to const) :类似于指针,快,&,参数传递尽量传引用。

    只为速度快,不希望改数据,可以在前面加 const

    返回值传递:return by value vs. return by reference(to const)

    尽量by reference,有的不允许

    黄色部分都是返回类型

    friend(友元)

    朋友函数可以直接取 private 里的数据

    相同 class 的各个 objects 互为 friends (友元)

    需要注意的几点:

           数据要放在private里

           参数尽可能用reference传,看情况决定要不要加const

           返回值尽量用reference传,除了一些情况不可以

           在类的body里,注意在需要的地方加const

           构造函数的特殊用法

    class body 外的各种定义(definitions)

    返回值不可以pass by reference的情况

    一个函数的运算结果,如果需要创建临时位置来存放,则不能传引用。


    5. 操作符重载与临时对象

    operator overloading (操作符重载-1,成员函数) this

    所以的成员函数都带着一个隐藏参数this,this指向调用者

    += 意味着把右边的参数加到左边去

    return by reference 语法分析

    返回的是value,但接受是用引用的形式,怎么接收的不需要知道。

    连串地赋值,c1和c2加完的结果不能是void,所以这个操作符返回类型不可以void。

    class body 之外的各种定义(definitions)

    operator overloading (操作符重载-2,非成员函数)(无this)

    设想使用者可能会怎么操作

    全局函数,没有this point


    temp object (临时对象) typename ();

    注意返回的为什么不是reference

    特殊语法  typename ();类似于 int(),没有名字,生命到下一行就结束了。

    编译器如何识别是加号还是正号,看参数个数

    第二个不能return by reference

    第一个因为不变,所以应该可以

    operator overloading (操作符重载),非成员函数

    重载<<   cout类型是ostream

    cout不可以是const

    如果连串输出,则不可以用void类型

    相关文章

      网友评论

          本文标题:C++面向对象高级编程(上)笔记一(Boolan)

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