zoukankan      html  css  js  c++  java
  • 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更安全。
  • 相关阅读:
    ural(Timus) 1019 Line Painting
    ACMICPC Live Archive 2031 Dance Dance Revolution
    poj 3321 Apple Tree
    其他OJ 树型DP 选课
    poj 3548 Restoring the digits
    ACMICPC Live Archive 3031 Cable TV Network
    递归循环获取指定节点下面的所有子节点
    手动触发asp.net页面验证控件事件
    子级Repeater获取父级Repeater绑定项的值
    没有列名的数据绑定
  • 原文地址:https://www.cnblogs.com/lp3318/p/4845014.html
Copyright © 2011-2022 走看看