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

2018-01-08  本文已影响0人  CarmenS233

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类型

上一篇下一篇

猜你喜欢

热点阅读