C++面向对象高级编程(上)笔记一(Boolan)
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类型