首页 > 代码库 > 《C++程序设计》的要点记录
《C++程序设计》的要点记录
20170723修改:Markdown对代码和表格的兼容性不好,改成TinyMCE编辑的格式了,这样看起来没那么别扭了!
前言
第一次写博客,也是第一次用markdown写博客,觉得会比较有意思吧!能够长期坚持写博客应该是个很优秀的习惯,作为小白,希望自己能够踏踏实实一步一个脚印的记录自己所学的东西。第一篇写的是谭克强老师的《C++程序设计》的读书笔记,主要记录该书中的一些知识点,由于该书将的内容比较局限和浅显,但是还是适合我这个非专业编程人员看,算给自己入个门和打个C++基础,下一步就好好啃《C++primer》这本圣经,重要的就是要养成做读书笔记的习惯,永远相信“不积跬步,无以至千里”这句话!哈哈,算是一种勉励自己的方式吧,加油,Chris_lzy!初稿写于2017年7月22日下午晴
第一篇 基本知识
- 字符串常量:"abc\n"包含4个字符,但是内存中占有5个字节(包含"\n"结束字符)。
- 强制类型转换运算符:在强制类型转换时,得到一个所需类型中间变量,但原来的变量的类型未发生改变,eg:`(int)x`, 如果x原指定为float类型值为3.6, 强制转换后得到int型值为3,但是x得类型与值并没有发生变化。
- C++的输入与输出:在执行cout语句时,并不是一插入一个数据就马上输出,而是将数据放入缓冲区,直到缓冲区满或者遇到endl(或‘\n‘、ends flush等)为止,此时将缓冲区中的数据一并输出,并清空缓冲区;在执行cin语句时,系统会将空格作为数据的间隔符,回车换行键作为结束符。所以这两个字符不能作为字符变量的输入,但是getchar函数可以。
- 运算符的优先级:!(非)>算术运算符 > 关系运算符 > &&(与)和||(非) > 赋值运算符
第二篇 基于过程的程序设计
- 条件表达式:(a>b)?a:b,如果(a>b)为真,这表达式值取a,否则取b。
- switch语句:`switch(表达式) {}` 表达式可以为任何类型,记住break、default。
- while和do-while语句:while先判断表达式,然后决定是否进入语句;do-while先进入一次语句,再判断表达式。
- break和continue:break是结束整个循环,continue是结束本次循环进入下次循环
- 内置函数(inline):内置函数中不应该包括复杂的控制语句,如循环和switch语句,内置函数的作用是减少函数调用的时间开销,但是在编译时增加了代码的长度。
- 函数的重载:一名多用,根据函数的参数个数和类型的不同,用同一个函数名定义多个函数。
- 函数模板:通用函数,调用函数时会根据实参的类型来取代模板中的虚拟类型。
- 有默认参数的函数:默认参数必须放在形参的表列的最右端;一个函数不能即作为函数重载,又作为默认参数的函数,否则会产生二义性。
- 函数的递归调用:递归公式+递归结束的条件(边界条件)。
- 变量的作用域、生命周期:(1)按照作用域可分为局部变量(动态局部变量、静态局部变量和函数形参)和全局变量(静态全局变量、外部变量);(2)按照生命期可分为动态存储(动态局部变量、函数形参等)和静态存储(静态局部变量、静态外部变量和外部变量等)
- 内部函数(static)和外部函数(extern,可省略):内部函数只能被本函数调用,外部函数能够被其他文件调用,现在常用包含头文件的方法。
- include命令的两种形式:(1)`#include<文件名>` 例如`#include<iostream>`包含的是C++系统提供的头文件;(2)`#include"文件名"`例如`#include"c:\tan\file.c"`要求编译系统在指定路径寻找头文件,例如`#include"file.c"`在用户程序当前路径下寻找文件。
- 字符串处理函数:(1)字符串连接函数strcat,函数原型为`strcat(char[],const char[])`;(2)字符串复制函数strcpy,函数原型为`strcpy(char[], const char[])`; (3)字符串比较函数strcmp,函数原型为`strcmp(const char[], const char[])`; (4)字符串长度函数strlen,函数原型为`strlen(const char[])`。**注意**:可以用字符串常量初始化字符数组,但不能用字符串常量给字符数组赋值;可以用字符串常量初始化和赋值字符串变量。
- 指针作为函数形参:(1)正确的例子
void swap(int *p1, int *p2 ) { int temp; temp=*p1; *p1=*p2; *p2=temp; }
(2)错误的例子
void swap(int *p1, int *p2) { int *temp; *temp=*p1; *p1=*p2; *p2=*temp; }
分析:例二中定义了指针变量temp,未对该指针变量赋值(指向对象),但是对*temp赋值是非常危险的,可能会破坏系统的正常工作。
- 引用一个数组元素:(1):下标法`a[i]` (2):指针法`*(a+i)或*(p+i)`其中a为数组名,p为指向数组某元素的指针。
- 指针与自加运算:
(1) *p++等价于*(p++)先得到p指向变量的值*p,再使p指针加1;
(2) *(++p)先对p指针值加1,再取p指向变量的值;
(3) (*p)++表示对p所指向变量的值加1。
- 指针数组和数组指针:
(1)指针数组:int *p[n] 数组由n个指向整型数据的指针元素组成;
(2)数组指针: int (*p)[n] p为指向n个整型元素的指针变量。
- 引用:在声明一个引用类型变量时,必须同时使之初始化,即声明它代表那一个变量,引用主要把它作为函数的参数,以扩充函数传递数据的功能,它向形参传递的是实参的地址而不是实参的值。指针变量作为形参是需要开辟内存空间,而引用变量不是一个独立的变量,不单独占内存空间。
- 共用体(union):使用共用体的目的是希望用同一个内存段存放几种不同类型的数据,共用体变量所占内存的长度等于最长的成员的长度,共用体变量在访问成员是在每一瞬间只能有一个成员起作用,其他成员不起作用。
- 枚举类型(enum):格式为 enum 枚举类型名 {枚举常量列表};枚举元素为常量,因此不能对他们赋值。
第三篇 基于对象的程序设计
- 成员函数的存储方式:每个对象所占用的存储空间只是该对象的非static数据部分的所占用的空间,而不包括函数代码和static成员变量所占用的空间,不同的对象通过this指针调用成员函数。
- 函数初始化列表:例如`Box::Box(int n, int w, int len): height(h),width(w),length(len) {}`.
- 共用数据的保护(const):
(1)常对象:常对象中数据成员为const型,成员函数为non-const型,外部不能调用该对象的non-const成员函数。`
(2)常成员数据:只能通过构造函数的参数初始化列表来对常成员函数初始化
(3)常成员函数:只能引用本类的数据成员,而不能修改它
数据成员 | 非const成员函数 | const成员函数 |
|非const成员数据 | 可以引用,也可以改变其值 | 可以引用,但不可以改变其值 |
|const成员数据 | 可以引用,但不可以改变其值 | 可以引用,但不可以改变其值 |
const对象的成员数据 | 不允许 | 可以引用,但不可以改变其值 |
- const与指针(左定值,右定向):
(1) const 类型名 *指针变量名:指向常对象的指针变量(左定值)
(2) 类名 * const指针变量名:指向对象的常指针(右定向)
- 实现数据的共享(static):
(1)静态数据成员:静态数据成员在内存中只占一份空间;它属于类,不属于对象,为对象非配内存空间时不包括静态成员所占的空间;静态成员的初始化只能在类体外进行;静态数据成员既可通过对象名引用,也可通过类名引用。
(2)静态成员函数:静态成员函数主要是用来访问静态数据成员的,而不能访问非静态成员(没有this指针);静态成员函数可以通过对象名引用,夜可以通过类名引用。
《C++程序设计》的要点记录