C++之鸡零狗碎

========================================================================

♦集中关注概念,不要迷失在语言细节中;支持一种逐步推进的学习方式。

♦一个定义良好的用户类与内部类的差别仅仅在于其定义方式。

♦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类型,但没有运行时类型检查来保证转换的安全性。

①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
 
 
dynamic_cast(运行时检查的转换)
用法:dynamic_cast <type-id> (expression) 可以在执行期把expression转换为type-id类型,决定真正的类型。Type-id 必须是类的指针、类的引用或者void*;
如果 downcast 是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果 downcast 不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
原文地址:https://www.cnblogs.com/lp3318/p/4845014.html