侯捷-C++面向对象高级开发 Note

本文介绍了C++编程的基本概念,包括面向对象编程的Object-Based(基于对象)设计,如无指针成员的类和复杂的类,以及如何处理类之间的关系。文章还涵盖了C++的历史发展,从B语言到C++,并探讨了标准库的演变。此外,详细讲解了头文件的使用、类的声明、内联函数、访问级别、构造函数、常量成员函数、参数传递和返回值策略,以及友元的作用。
摘要由CSDN通过智能技术生成

1 C++编程简介

目标

  • 培养正规的、大气的编程习惯
  • 以良好的方式编写C++ class,Object Based(基于对象)(面对的是单一class的设计)
    class without pointer members - Complex
    class with pointer members - String
  • 学习Classes之间的关系,Object Oriented(面向对象)(面对的是多重classes的设计,classes和classes之间的关系)
    继承(inheritance)
    复合(composition)
    委托(delegation)

C++的历史

  • B语言
  • C语言
  • C++语言(1983)
    (new C -> C with Class -> C++)

C++演化(成为标准)

  • C++ 98 (1.0)
  • C++ 03 (TR1, Technical Report 1)
  • C++ 11 (2.0)
  • C++ 14
C++
C++语言
C++标准库

书籍推荐
语言基础:
《C++ Primer(5th)》《The C++ Programming Language(4th)》
专家经验:
《Effective C++ 55 - Specific Ways to Improve Your Programs and Designs(3th)》
标准库:
《The C++ Standard Library》 《STL源码剖析》

2 头文件与类的声明

2.1 C vc C++,关于数据和函数

C语言中数据是全局的,各个函数都可以访问数据,有可能出现问题;
C++思路是将数据和处理数据的函数封装在一起成为class。
函数来处理数据。
在这里插入图片描述

2.2 C++ program代码基本形式

包含标准库使用尖括号,不必关注头文件路径
不同平台的后缀名可能不同
在这里插入图片描述

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

受过正规训练 😃 进入业界做大东西好东西 😃
头文件可能被多个文件包含可能被包含多次
在这里插入图片描述

2.4 Header(头文件)的布局

在这里插入图片描述

2.5 class的声明(declaration)

  • 实部和虚部类型为double
    在这里插入图片描述
  • class template(模板),避免因类成员不同导致写多个重复的类(如成员为int的类、成员为double的类、成员为float的类),其中的T可以为任何字母一般为T
    在这里插入图片描述

2.6 inline (内联)函数

内联速度会更快(???)
某些情况下即使写成inline,编译器也不会处理为inline,如函数很复杂。写成inline只是“建议”,是否inline由编译器决定。class body内的函数定义会自动inline(候选),class body外的函数内联需要加inline。
在这里插入图片描述

2.7 access level(访问级别)

数据部分为private
在这里插入图片描述

2.8 constructor(ctor,构造函数)

变量的设置有两个阶段,一个是初始化,一个是赋值,构造函数函数体中对成员变量进行赋值(assignments)错过了初始化的阶段,时机更晚效率更低。
像复数这样不带指针的类中大多不需要写析构函数。
在这里插入图片描述

  • 构造函数可以有很多个 - overloading(重载 )(多个相同名称的函数,参数不同)
    编译器会把同名的重载函数编译成不同名称的符号
    参数有默认值的构造函数会和默认构造函数发生冲突,不能同时存在(complex(double r = 0, double i = 0)complex()),因为不给参数的构造方式(complex c1;complex c2();)会存在问题。
    在这里插入图片描述
  • 构造函数可以放在private区域
    不允许外界通过构造函数创建对象
    在这里插入图片描述
    SIngleton(单例模式) - 设计模式
    在这里插入图片描述

2.9 member functions (成员函数)

  • const member functions(常量成员函数),在函数后加const
    不会改变类的数据 vs 会改变类的数据, 前者则需要将函数声明为常量成员函数。
    不会改变数据的成员函数如果不加const,那么常量类型的对象访问该成员函数时编译会出错(const对象调用非const函数)。
    在这里插入图片描述

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

传值,整个数据传过去,压栈,尽量避免传值减少开销
C语言可以传指针
C++规定了传引用(类似于传指针速度,但是比指针更漂亮:-)),尽量传引用(字符类型(1byte)可以直接传值)
参数传引用并且用const修饰,避免函数修改该参数,如果函数内部修改了该函数编译器会报错。
如果不用const修改,那就是希望函数能够修改该参数。
在这里插入图片描述

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

返回值的传递也尽量传引用(如果可以
在这里插入图片描述

2.12 friend(友元)

朋友可以来拿我的“钱”(数据)😃
朋友打开封装的大门,但是如果通过函数间接访问数据速度会慢一些
在这里插入图片描述

  • 相同class的各个objects互为friends(友元)
    截图中在类外部直接访问数据,看似打破了封装,但是成立
    在这里插入图片描述
    一个好的类
  • 构造函数初始化列表
  • 数据private
  • 引用方式传参数
  • 引用方式返回(如果可以)
  • 成员函数加const
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值