C++须知(部分)

引用一篇文章一段话:到底要不要学习C++。其实这个问题问得很没有意义。“学C++”和“不学C++”这个二分法是没意义的,为什么?因为这个问题很表面,甚至很浮躁。重要的不是你掌握的语言,而是你掌握的能力,借用myan老大的话,“重要的是这个磨练过程,而不是结果,要的是你粗壮的腿,而不是你身上背的那袋盐巴。”。此外学习C++的意义其实真的是醉翁之意不在酒,像C/C++这种系统级语言,在学习的过程中必须要涉及到一些底层知识,如内存管理、编译连接系统、汇编语言、硬件体系结构等等等等知识(注意,这不包括过分犄角旮旯的语言枝节)。这些东西也就是所谓的内功了(其实最最重要的内功还是长期学习所磨练出来的自学能力)。对此大嘴Joel在《Joel On Software》里面提到的漏洞抽象定律阐述得就非常漂亮



1 C++是区分大小写的

2 Main函数中的参数argv的全称呼是:argumentvalue参数值

3 #include是预处理命令的标示。预处理器的任务就是从头到尾读源代码,查找以#开头的代码行,每发现一行,就按照预处理命令的要求修改代码,所有预处理操作都在编译器编译代码之前完成。

4 <<符号称为插入符,其作用是把位于其后的内容传给cout对象

5 C++没有要求表达式必须写在一行上

5 cin是<iostream>库中表准输入流,>>运算符被称作提取符(extractor),其作用与插入符相反,从箭头指向的方向可以看出,输入数据来自cin。

6 C++被称作强类型语言,区别变量的类型是组成强类型语言的一个重要特征

7 char类型便来用来包含ASCII字符集中的字符,它是计算机使用的256个标准字符,然而ASCII不能表示宽字符集(如日文),因为其字幕表很大,字幕需要超过1个字节大小(多字节字符)的空间存储,wchar_t数据类型通常用于表示宽字符

8 在变量定义的时候给变量进行一个有意义的赋值是非常好的编程习惯,通常被称为——防御性编程

9 程序发现错误,进行修改以后,重新进行测试,这称为回归测试。

10 所有测试的输入数据都是有效的数值,这样的测试称为边界内测试,另外,还有边界外测试

11 cerr是一个标准错误输出流,与标准输出流cout几乎相同,错误提示消息与cout出现在同一个屏幕窗口,只是使用场合不同

12 把代码分解成若干独立的函数——重构

13 使用模块的原因:1 当程序变大时,我们只需要编译过更改的那部分代码,从而节省编译时间2 可以与其他程序员共享模块,其他程序员可以使用iostream库那样使用你创建的代码

14 制作头文件常用技巧: #ifndefSHINE

                        #define SHINE

                          “”

                        #endif

上面这一段话可以防止在““里面的内容被重复编译。

15 命名空间的名字应该保持唯一,有意义,与模块函数的名字结合起来也应该有意义

16 编译器一般产生以.obj或.o后缀的中间文件,链接器负责把中间文件组合成可执行文件(在windows下是.exe文件在Unix下是么有后缀名的文件)

17 跟if语句嵌套一样,应该考虑把内部的循环用单独的函数代替。

18 静态变量在程序开始时创建和初始化,直到程序结束时才销毁,实际上,静态局部变量很像全局变量,但静态局部变量隐藏与函数体内,外部无法访问,所以静态局部变量不想使用全局变量那样容易陷入缺陷

19 C++一个关于数组的技巧:数组索引从0开始,而元素个数从1开始,所以新元素的索引等于元素组中元素的个数

20 ++前缀表示——先递增,然后返回递增的结果,++后缀表示“先返回当前数值,然后在递增原函数值

21 在调用函数函数之前,函数的返回值和参数所需的存储空间被压入栈中,“堆“是一堆无需,可用的内存,在给定的时间,可能只有其中的一部分被使用。如何告诉编译器从堆中分配内存,而不是从栈上分配内存。我们可以使用操作符new

                            type * name=newtype

22 一个字符串后面还有一个隐含的,不可见的字符,用来标示字符串的结尾。

字符串很重要,因为C++库很多函数都需要知道字符串文本的结尾。字符串结束符为数字零,与字符“0“不同。

23 表达式Operator[Index]真正的意思是(*(Operate+(Index*sizeof(char))))即获取距离数组其实位置一定距离(char大小的index倍)的某块内存空间的内容,对于较大的数组,由于大量的乘法运算,复制操作将显著变慢。因此,很多C++程序员都要使用指针的形式复制

24 *ToOperator++=*FromOperator++

记住*(也称解印操作符)具有最高优先级,后缀递增运算符在数值后才起作用,读作”将FromOperator”指向的元素内容复制到ToOperator指向的元素地址,然后指针指向下一元素。

25引用声明使用 &,而不是*,引用不是指针,它只是某个变量或地址的别名。

26 &(读作“····的地址“)

27 引用只能在定义的时候初始化,并且只能初始化一次,以后不能在引用其他内容,

28 用名词而不是动词命名函数,可以表明函数内部存在内部状态,不只依赖某次特殊调用传入的参数。

29参数命名后跟着等号和数字0,这表明该参数为可选参数

30 使用#define开始和关闭调试,可以用#ifdef,#define#endif避免多次包括一个头文件,也可以使用预处理命令#define #ifdef和#endif控制编译器只有在某个特定的符号背后定义才能看到特定部分的代码, 例如:

  #define  DEBUGGING

  ```

  #ifdef    DEBUGGING

    *****************

#endif

这样做的好处是,如果你删掉#define ,编译器就不会编译#ifdefDEBUGGING行,使用这种办法,在用编译器溢出调试语句时,能够降低调试程序被破坏的风险。

31 变量声明前缀的一种使用方法: an或者a开头表示是用户定义类型,而不是标准类型,局部变量 ,常数,形参或者静态局部变量。

32 与其他类型不同,函数指针的声明要求使用typeof关键字,另外,函数指针的声明和原函数唯一区别的是函数名用(*nameoftype),*在这里表示指向类型名为nameoftype的函数



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值