========================================================================
♦集中关注概念,不要迷失在语言细节中;支持一种逐步推进的学习方式。
♦一个定义良好的用户类与内部类的差别仅仅在于其定义方式。
♦C++设计目的就是:是较大程序能够以合理的方式构造出来;
C++特征诸如:能够以一种直截了当的方式去和硬件打交道而不顾及安全性等;将代码隐藏在优美的界面之后。
♦程序设计语言有两点:描述执行的动作载体(低级语言,效率高)
---------------------为程序员提供一组概念(基于设计的观点,提出诸如对象的概念 使得描述尽可能接近实际问题)
♦模板的设计,从根本上说是为了支持静态类型容器和优雅有效地使用这些容器;
♦C++编程三部曲:分析(取得对问题的清晰理解)、设计(标识一个解决方案中所涉及的关键概念)、编程(将问题解决方案用语言具体表示出来)
----有些概念不能用某个基本类表示,所以可以用户自定义,又因为概念之间不是孤立存在的,所以有了继承、调用等等东西。威力最强大的一种管理复杂性的智力工具就是某种层次性的序关 系,将互相有关的概念组织到一个数型结构中,使最一般的概念为树根。组织起来的结构是一个有向无环图,为了确保有向无环图不会因为某些依赖关系而出现环路,利用到工具是界面和实 现分离(抽象类)。
----共性的东西可以通过模板表示。
----如何在C++里写出好的程序-“了解你想说什么” 以及 “实践、模仿好作品”。
===================================================================
C++概览:
♦过程设计
♦模块化设计
模块:一集相关过程和他所操作的数据组织在一起。
模块设计---------------------->异常处理
(界面和实现分离,分别编译) (要在模块基础之上考虑,哪些模块要处理那些错误)
♦数据抽象
--在这里强调的是设计方法及组织程序的方式而不是语言细节
--用户定义类型:new->堆或动态存储;
--具体类:
--抽象类型:
子类是父类的具体实现,类只是一个接口(界面),用来将实现与使用分离,实现信息隐蔽。
--虚函数:
每个带有虚函数的类都有虚函数表(编译器把虚函数名字装换为指向这些函数的指针表(虚函数表)的一个下标),其开销是在对象里多一个指针
♦面向对象
共性抽象为虚函数并作为基类,体现 层次结构
♦通用设计
--容器(类):模板是一种编译时机制
--通用型算法:操作容器而又不必知道它是什么类型
==================================================================
STL概览(基本数据结构和在它们上操作的基本算法)
♦命名空间:标准库定义在命名空间std中,其每种功能是由头文件提供的;
♦字符串:c风格字符串就是以0结尾的字符数组;c_str()函数返回一个指向C风格字符串的指针常量, 内容与string串相同. name.c_str().
♦输入输出流:默认情况下cout输出的值都被转换为字符序列
♦容器:vector动态数组,随机存储;list 插入删除很快速;map 升序保存它的元素。
♦算法:(替换、查找、复制、排序)
-迭代器:(1)是容器定义的一部分,用户根本不需要知道它的类型。(2)迭代器之间类型差异巨大,因为他是为某种容器量身打造的,去完成某种功能。(3)迭代器是用来处理序列的有用工具,通过while循环实现遍历。在I/O中同样适用,写入输出流从输入流中读取,主要是为了给算法提供参数。
-谓词:
==================================================================
♦字符串文字量:
-定义:“适当个数的const字符数组”,“Bohr”类型就是const char[5];
-可以给char* 赋值,char* p=“Bohr”;此时,试图改变*p的值结果无定义,如:p[4]='e'//错误
-char ch[]="Bohr"; ch[0]='R';//可以
-const char*p="liangpeng"; const char*q="laingpeng";
p!=q (在运用指针时,==比较的是指针的值(地址),而不是所指的东西)
♦数组和指针
-char* p=“Bohr”; //strlen(p)=4;sizeof(p)=5
-对字符数组的遍历,可以用指针或下标,结束都是用’0‘;如何数组没有结束符,则必须以某种方式提供元素个数。
♦常量const
-必须初始化,最常见的用途:作为数组的界和分情况标号;可用enum替代;一个常量数值代表程序的一种假设,但是要有良好的注释;
-区分const char* pc=“lp”和char *const cp=“lp”;以* 为分界从右向左看。
♦引用
-必须初始化,初始化之后,他总是引用所指的那个对象,除了表象之外,根本没有操作符能操作引用,操作的都是被引用的对象。
-将右值(临时对象或文字量)约束到非const引用是非法的。
-对“普通”的T&初始式必须是一个T类型的左值;对于一个const T&的初始式不必是左值,甚至不必是T类型。
[1].到T的隐式转换;
[2].将结果存入T类型的临时变量;
[3].用该临时变量来初始化
♦struct
-其中的对象有对齐性质(编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍。)。计算时从大到小排列,以取得最小空间浪费。http://blog.csdn.net/csw_100/article/details/5495309
-struct名字出现之后就可以使用
struct Link{
Link*previous;
Link* successor;
};
-只有在看得到完整声明之后才可以声明结构类型对象。
♦void*
=======================================================================
♦
static_cast (编译时检查)
用法:static_cast < type-id > ( expression ) 把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。