C++编程思想-C++中的C

本文介绍了C++的基础知识,包括函数创建、执行控制语句、运算符、数据类型、作用域等概念。此外还讲解了复合类型创建、调试技巧及函数地址的使用。

3.1创建函数

  • 函数原型: 声明和定义函数时,必须使用参数类型描述。
  • C++中,函数定义的参数列表中可以使用未命名的参数。
  • 不确定参数列表用省略号(…)表示。

3.2执行控制语句

  • true and flase
  • If-else
  • while
  • do-while
  • for:每一次循环之前,conditional 被测试,如果含有continue,步进不会跳过。
  • break-continue
  • switch-case
  • goto:跳出多层循环
  • 递归:例如:汉诺塔

3.3运算符简介

  • 工程中直接用括号使计值次序更清晰。

3.4数据类型简介

  • 内建基本类型:char,int, float, double ,规范只规定了内建类型必须存储的最大值和最小值。

  • bool类型由true和false表示。

  • 说明符: 用于改变基本内建类型的含义并把它们扩展成一个更大的集合。

     long,short(改变最值),
     signed,unsigned(告诉编译器这样使用整数类型和字符的符号位,默认signed,但是char Implementation Defined)
     整数类型大小: short int,int,long int
     浮点大小: float,double,long double
    
  • 指针简介

     可以保存地址
     可以使用地址去修改原先的变量
     	1. 为了能在函数内改变“外部对象”
     	2. 为了获得许多灵活的编程技巧
     引用和指针仅仅是语法上的一种不同方法(语法糖)
     void* 意味着任何类型的地址都可以间接引用那个指针。(如果是 int*指针,则只能对int变量的地址间接引用那个变量)
     指针和引用与 基本数据类型和修饰符是独立的,由此可能产生三倍的组合。*/& + short/long + signed/unsigned
    

3.5作用域

  • scope 编译属性 (lifetime 运行属性)

  • 编译单元

     当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp文件名同名的目标文件(.o或是.obj)。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。
    
  • 自由函数

     如果一个函数是自由函数,那么这个函数不是类的成员函数,也不是友元函数。
    
  • linkage: 描述名称如何在不同编译单元间共享

     无linkage:连接器不知道,如自动变量。
     内部linkage:别的文件可以使用相同的标识符。
     	a.在C和C++中内部连接由static指定
     	b.const修饰,但是没有被extern修饰
     外部linkage:
     	a.全局变量和函数名
    

3.6指定存储空间

  • 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

3.7运算符及其使用

  • 赋值 “=”

  • 数学运算符 ±*/%

  • 关系运算符 > < >= <= == !=

  • 逻辑运算符 && || !

  • 位运算符 & | ^(异或) ~ (补)

  • 移位运算符 >> << 旋转移位(左旋 or 右旋)

  • 一元运算符:逻辑非,一元加,一元减,++,–,地址运算符,间接引用(* 和->),强制类型转换运算符,以及new 和delete

  • 三元运算符

  • 逗号运算符

  • 转换运算符

      (type)var
       type(var)
    
  • c++的显示转换

     static_cast:  明确定义的变换,类层次的静态定位
     const_cast: const 到非const
     reinterpret_cast: reinterpret_casts are applicable in two scenarios:
     		a. convert integer types to pointer types and vice versa (将整数类型转换为指针类型,反之亦然)
     		b. convert one pointer type to another. The general idea I get is this is unportable and should be avoided. (将一种指针类型转换为另一种。 我得到的一般想法是,这是不可移植的,应该避免。)
     dynamic_cast:类型安全的向下转换
    
  • sizeof

  • asm关键字

     这是一种转义机制,允许在c++中写汇编代码。
    

3.8创建复合类型

	typedef
	struct
	enum
	union
	array		

3.9调试技巧

  • 调试标记

     	预处理调试标记#define DEBUG
     	运行期调试标记 bool debug=false;
    
  • 把变量和表达式转成字符串

     #define PR(x) cout << #x " = " << x << endl; //把#后的参数转换为一个字符数组
    
  • C语言assert()宏

     在#include<cassert> 之前插入#define NDEBUG 可以消除宏产生的代码。
    

3.10 函数地址

  • 定义函数指针

     void (*funcptr)();
    

在这里插入图片描述
3.11 make管理分段编译

C++编程思想,目 录 译者序 前言 第1章 对象的演化 1 1.1 基本概念 1 1.1.1 对象:特性+行为 1 1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3 1.2.1 较好的C 3 1.2.2 采用渐进的学习方式 4 1.2.3 运行效率 4 1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺什么 10 1.3.6 方法应当提供什么 10 1.4 起草:最小的方法 12 1.4.1 前提 13 1.4.2 高概念 14 1.4.3 论述(treatment) 14 1.4.4 结构化 14 1.4.5 开发 16 1.4.6 重写 17 1.4.7 逻辑 17 1.5 其他方法 17 1.5.1 Booch 18 1.5.2 责任驱动的设计(RDD) 19 1.5.3 对象建模技术(OMT) 19 1.6 为向OOP转变而采取的策略 19 1.6.1 逐步进入OOP 19 1.6.2 管理障碍 20 1.7 小结 21 第2章 数据抽象 22 2.1 声明与定义 22 2.2 一个袖珍C库 23 2.3 放在一起:项目创建工具 29 2.4 什么是非正常 29 2.5 基本对象 30 2.6 什么是对象 34 2.7 抽象数据类型 35 2.8 对象细节 35 2.9 头文件形式 36 2.10 嵌套结构 37 2.11 小结 41 2.12 练习 41 第3章 隐藏实现 42 3.1 设置限制 42 3.2 C++的存取控制 42 3.3 友元 44 3.3.1 嵌套友元 45 3.3.2 它是纯的吗 48 3.4 对象布局 48 3.5 类 48 3.5.1 用存取控制来修改stash 50 3.5.2 用存取控制来修改stack 51 3.6 句柄类(handle classes) 51 3.6.1 可见的实现部分 51 3.6.2 减少重复编译 52 3.7 小结 54 3.8 练习 54 第4章 初始化与清除 55 4.1 用构造函数确保初始化 55 4.2 用析构函数确保清除 56 4.3 清除定义块 58 4.3.1 for循环 59 4.3.2 空间分配 60 4.4 含有构造函数和析构函数的stash 61 4.5 含有构造函数和析构函数的stack 63 4.6 集合初始化 65 4.7 缺省构造函数 67 4.8 小结 68 4.9 练习 68 第5章 函数重载与缺省参数 69 5.1 范围分解 69 5.1.1 用返回值重载 70 5.1.2 安全类型连接 70 5.2 重载的例子 71 5.3 缺省参数 74 5.4 小结 81 5.5 练习 82 第6章 输入输出流介绍 83 6.1 为什么要用输入输出流 83 6.2 解决输入输出流问题 86 6.2.1 预先了解操作符重载 86 6.2.2 插入符与提取符 87 6.2.3 通常用法 88 6.2.4 面向行的输入 90 6.3 文件输入输出流 91 6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 6.9 建立操纵算子 108 6.10 输入输出流实例 111 6.10.1 代码生成 111 6.10.2 一个简单的数据记录 117 6.11 小结 123 6.12 练习 123 第7章 常量 124 7.1 值替代 124 7.1.1 头文件里的const 124 7.1.2 const的安全性 125 7.1.3 集合 126 7.1.4 与C语言的区别 126 7.2 指针 127 7.2.1 指向const的指针 127 7.2.2 const指针 127 7.2.3 赋值和类型检查 128 7.3 函数参数和返回值 128 7.3.1 传递const值 128 7.3.2 返回const值 129 7.3.3 传递和返回地址 131 7.4 类 133 7.4.1 类里的const和enum 133 7.4.2 编译期间类里的常量 134 7.4.3 const对象和成员函数 136 7.4.4 只读存储能力 139 7.5 可变的(volatile) 140 7.6 小结 141 7.7 练习 141 第8章 内联函数 142 8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱 152 8.5 预处理器的特点 153 8.6 改进的错误检查 154 8.7 小结 155 8.8 练习 155 第9章 命名控制 157 9.1 来自C语言中的静态成员 157 9.1.1 函数内部的静态变量 157 9.1.2 控制连接 160 9.1.3 其他的存储类型指定符 161 9.2 名字空间 161 9.2.1 产生一个名字空间 162 9.2.2 使用名字空间 163 9.3 C++中的静态成员 166 9.3.1 定义静态数据成员的存储 166 9.3.2 嵌套类和局部类 168 9.3.3 静态成员函数 169 9.4 静态初始化的依赖因素 171 9.5 转换连接指定 174 9.6 小结 174 9.7 练习 174 第10章 引用和拷贝构造函数 176 10.1 C++中的指针 176 10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的选择 188 10.4 指向成员的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值