第一周 C++面向对象高级编程(上)Boolan

学习了Markdown以后,真是停不下来,以后笔记怕是离不开Markdown了。
这里只是展示一下效果,从为知到简书的转换实在是太手疼,以后不这么搞了TT
另外,笔记并没有整理完,哪有这么快的2333

0. 你应具备的基础

  • 曾经学过某种过程语言(C语言最佳)
    • 变量(variables)
    • 类型(types):int, float, char, struct ...
    • 作用域(scope)
    • 循环(loops):while, for
    • 流程控制:if-else, switch-case

1. C++编程简介

我们的目标- 培养正规的、大气的变成习惯

  • 以良好的方式编写C++ class(基于对象)

    • class without pointer members - Complex
    • class without pointer members -String
  • 学习Classes之间的关系(面向对象)

    • 继承(inheritance)
    • 符合(composition)
    • 委托(delegation)

你将获得的代码

complex.h
complex-test.cpp
string.h
string-test.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 Second Edition
STL源码剖析

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

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

C++,关于数据和函数

C++,关于数据和函数

complex(复数)
数据可能有很多份,而函数只有一份
string(字符串)
数据其实是一个指针ptr

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

  • Object Based :面对的是单一的 class 的设计
  • Object Oriented:面对的是多重classes的设计,classes和classes之间的关系

我们的第一个C++程序

Classes的两个经典分类:

  • Class without pointer member(s)
    complex
  • Class with pointer member(s)
    string

2. 头文件与类的声明

C++ 程序代码基本形式

C++ 程序代码基本形式
  • .h 头文件 声明
  • .cpp 主程序
    #include
  • .h 标准库

扩展名不一定是.h 或.cpp
也可能是.hpp,甚至没有扩展名

Output, C++ vs. C

Output, C++ vs. C

Header 头文件中的防卫式声明

Header 头文件中的防卫式声明
#ifndef __COMPLEX__ //如果不曾定义COMPLEX的话,就定义
#define __COMPLEX__
……
#endif

Header头文件的布局

Header头文件的布局

class 的声明(declaration)

class 的声明(declaration)

class template 模板简介

class template 模板简介

3. 构造函数

inline 内联函数

inline 内联函数
  • 声明(没有花括号的)
  • 定义(有花括号的)

inline

函数若在class body内定义完成,便自动成为inline候选人
函数太复杂,就可无法变成inline,这由编译器决定
优点
像个壶?一样
不在本体中定义的,可以加 inline 来定义。

access level 访问级别

access level 访问级别
  • public
  • private
  • protected

可以交错
错的是因为调用了private的变量

constructor ctor 构造函数

constructor ctor 构造函数

自动调用的,不用自己去调用
??被调用的是什么?
构造函数的名称必须与类的名称一致,可以带有参数,可以有默认值
没有返回类型,不需要有
构造函数独有的语法:初始列,初值列initialization list
: re (r) , im (i)和本体里赋值是一样的,但尽可能要这样写
差别在于:
数值的设定有两阶段:

  1. 初始化
  2. 赋值

赋值相当于放弃了初始化的步骤,降低效率
不可能去手动调用构造函数,只能去创建对象,自动的就会调用构造函数。
这就是不带指针的类
不用写机构函数??

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

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

函数名可以重复,但是不能都加const
函数被编译器处理后,很可能名字会变得很长
因为有默认值,所以不能像②那么写,因为调用时有歧义

complex () : re (0) , im (0)  { }

变量尽可能放在private区,而函数尽可能放在public区

构造函数被放在private区

构造函数被放在private区

这时候就无法调用构造函数。
可以这么做,建立一个不能被调用的构造函数

ctors放在private区

ctors放在private区

单体singleton

4. 参数传递与返回值

const member functions (常量成员函数)

const member functions (常量成员函数)

在函数后面加const,不改变数据内容
设计的时候就应该知道需不需要加,不加的话就会出问题
编译时会出错。

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

传递值,与传递关系,传递引用
引用
底层就是一个指针,但是形式又很漂亮
最好所有的参数传递都传引用,尽量不要传值(有的时候不可以)
如果希望不能改这个值,就加const

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

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

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

friend(友元)

朋友可以来拿的数据

friend complex& __doapl ()

__doapl可以直接使用private中的reim

friend(友元)

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

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

注意这几点

  1. 数据一定放在private
  2. 参数尽可能以引用来传
  3. 要不要加const,需要就加,不加可能在使用的时候会报错
  4. 构造函数,特殊的语法,初始列

class body 外的各种定义(definitions)

class body 外的各种定义(definitions)

什么情况下不能 return by reference

  1. 函数必须新创建一个位置去放,函数运行完,这个变量就消失了,这时候必须传数据
  2. 函数把新值放在其中一个位置,这时可以传reference

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

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

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

在C++里操作数就是一种函数,可以重新定义
编译器如何看待操作符
二元操作数
左操作数,右操作数
隐藏参数(this)
调用者就是this
c2是一个指针,地址被传入this
__doapl do assignment plus
任何一个成员函数都有一个隐藏的函数:this pointer

return by reference 语法分析

return by reference 语法分析

左操作数是个指针
返回的是一个数据
说明的是返回的是一个引用
传递者无需知道接受者是以reference形式接收
接收pointer必须传pointer
接收reference可以传value
要先想到会怎么用,比如说连串的赋值(使用),所以要注意返回值

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

虚部和实部

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

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

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

为了应对client的三种可能用法,这里对应开发了三个函数
复数+复数
复数+实数
实数+复数
全域、全局函数,没有this pointer

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

返回的为什么不是reference

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

因为它们返回的必定是一个local object
特殊语法:
typename();类似于int(i+j);
创建临时对象,没有名称

一个习题,把+改成reference,看看能不能运作

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

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

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

参数的传递快不快?
返回的时候快不快?

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

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

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

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

<<操作符的重载

解释成cout可以理解的形式

cout是个对象,是什么type,要去查手册
能不能在接受类型处加const?不行,因为可能变成连串

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容