1.C++概述
面向对象:
学习classes间关系
继承inheritance、
复合composition、
委托delegation
语言复杂度上升,使得标准库越来越强大并日益成为编程工具的核心
推荐教材:
C++ Primer fifth edition(C++第一个编译器的实现者),
The C++ Programming Language fourth edition (C++之父),
Effective STL,
The C++ standard library the second edition,
STL源码剖析
C/C++ 代码对比
C 数据(单独的数据类型,全局数据,都可被函数房问)+函数(处理数据)
C++ class(数据和处理它的函数包装在一起) C++中 class与struct几乎完全相同
C 以数据的方式创建变量
C++ 以class为形式,创建对象
基于对象:
以良好的方式编写class
class without pointer members —— complex
数据:实型常量(实部、虚部)
函数:加、减、乘、除、共轭、正弦
在内存中对象结构包涵着完整的数据
class with pointer members —— string
数据:指针
函数:拷贝、输出、附加、插入
在内存中只有指针在对象结构里,字符串数据存放在指针指向的内存空间
Object Based : 面对的是单一class的设计
Object Oriented : 面对的是多重classes的设计,classes和classes之间的关系。
2. C++代码的基本形式
.h (header files)Classes Declaration #include "complex.h"
.h Standard Library #include
延伸名可能不一样甚至没有
-> C++中C的标准库对应+c在开头
.cpp
3.头文件中防御式声明(guard)
#ifndef __COMPLEX__
#define __COMPLEX__
...
...
#endif
防御式声明帮助coder不必关注包含头文件的次序,防止了重复包涵和编译
防御式声明内部的三部分:
0、forward declarations 前置声明
1、class declarations 类声明
2、class definition 类定义
先写1中class head/body 再去0补定义
4.class相关语法
类模板:template声明接下来定义的class为class template,可以在使用时再定义里边的变量类型
inline标识符:
有些函数在class body直接定义,默认含有inline标识符函数若在class body内定义完成自动成为inline候选人,函数太复杂就不能inline实现,
函数以inline书写只是建议编译器以inline方式编译
friend(友元标识符):
友元函数可以方位private域的数据
相同class的各个objects互为friends友元
const标识符:
const + typename (语法上可以颠倒顺序)常对象,常对象必须进行初始化,而且不能被更新,只能被常函数操作
return type + function name + arguments + const 常成员函数
常对象只能调用常成员函数;
常成员函数调用期间,目的对象都被视同为常对象,所以常成员函数不能更新目的对象的数据成员,常成员函数不会更改目的对象的数据成员的值。
常数据成员 const + typename
常引用 const +形参 所引用的对象不能被更新
访问级别:
public(function 外部调用) 可任意被外部访问
private(data) 只可被友元函数(由friend标识符提示)和同类对象访问
protect可被友元函数(由friend标识符提示)和同类对象访问,且可被子类访问。
不一定集中书写同一访问级别的信息,可以分开声明并书写,不声明且没有访问域信息时默认为private
外部不能直接访问class的private数据,数据一定要通过函数访问和修改——封装
构造函数:构造函数(ctor),如果你想要创建一个对象,自动被调用的函数
构造新对象的三个方式:构造函数(赋值/默认) 动态创建(得到指针)
构造函数名称与类名称一致,可以拥有参数,参数可以有默认值(default argument),没有返回值类型(return type),(其它函数也可以写出参数默认值)
初值列(initialization list)(构造函数特有,功能可由写在函数体内的赋值语句代替,但是初值列更优) 格式”:数据名(参数名)“
初始化->赋值(assignments) 数据写入的两个阶段,不使用初值列即放弃了初始化,降低了程序效率
只能创建对象,不能直接调用构造函数
构造函数可以有很多个(相同函数名称多个函数实体——重载overloading),多种初值设定
多个同名函数会被编译器区分,函数名称 函数内参数(个数/类型)编码 以区分, 具体编译后编码取决于编译器
有默认值得参数不能通过省略它完成同名函数的区分
如果将构造函数的放在private域,则意味着该对象不能被从外部创建,设计模式——singleton(单例、单体、单件),用static A
3.pass by value vs. pass by reference (to const)
by value 整包传递,把所有值压入函数的栈,尽量避免,因为一些对象数据量比较大,这么做会给内存带来负担
by reference 类比C传递指针,reference引用(底层是一个指针 4bytes),但形式更好,最好所有参数传递都传引用(本质是为了效率),但注意和指针一样会修改原数据
by reference to const 在reference前添加const声明,避免原数据被改变,声明后,若需改变原值,则编译时会报错
return by value vs. reutrn by reference (to const) 尽量by reference,但注意有些情况不能用by reference
pass by reference的条件:多用于不改变原值得情况,大多数情况可用
return by reference的条件:运算结果存储在某一个参数中,如果以local variable存储函数处理结果,因为其易失性,只能传递value因为reference无意义
return by reference语法分析:传递者无需知道接收者是以reference形式接收
4.operator overloading(操作符重载):将操作符视为函数的一种,注意操作符函数具有左右参数在函数中的映射关系
实现方式:
成员函数:
所有成员函数都隐藏一个参数this(调用函数的对象),会把this是一个指针,传入调用对象的地址
this不能显式的在参数中给出,但可以在成员函数中调用
注意连串使用时,对函数返回类型的要求,一般与调用它的变量类型一致
非成员函数:无this pointer,且左值不一定为该类对象
”<<“重载,必须为全局函数,因为作用在cout(ostream class对象)上,cout事实上被<<不断改变,注意类型保持才能连续应用操作符,或者说,注意连续应用该操作符的条件
5.class body 外的各种定义
全局(全域)函数 无类名称 class尽量用reference传递
任何一个操作都可以定义为成员或全局函数,并无明显的优劣之分
6.temp object(临时对象) typename() 生命到下一行就结束了,因此无变量名,标准库中常用