C++学习笔记(Thinking in C++) 一

来源:互联网 发布:淘宝横向布置 编辑:程序博客网 时间:2024/06/04 18:59

1、解析器与编译器

   a、解析器是将源代码转化为一些动作(它可由多组机器指令组成)并立即执行这些动作;

     好处:写代码到执行代码速度快;很快之处源代码错误的地方;交互性好;

     坏处:解析器必须翻译任何重复的代码,程序执行就会变慢;解析器必须驻留内存,以执行程序;大部分解析器要求一次输入整个源码;

   b、编译器是直接把源代码转化为汇编语言或机器语言;

     好处:执行速度快;运行空间小;支持分段编译;

     坏处:编译时间长;错误调试麻烦;

 

2、C与C++函数声明的一点不同

    int func2();

   C中表示:一个可带任意参数(任意数目,任意类型)的函数。

   C++表示:不带参数的函数。

   因此,最好把声明写成int func2(void)。

   函数声明时参数标识符是可选的。函数定义时则要求要有标识符(这是c的要求,c++则没有这个要求)。

3、头文件与命名空间

   #include <iostream.h>

   相当于

   #include <iostream>

   using namespace std;

4、全局变量

   全局变量不受作用域的影响,总是可用的。如果一个文件中实用extern关键字来声明另一个文件中存在的全局变量,也是可以的。

   而局部变量的类型为auto,寄存器的变量为register(register变量是保存在寄存器中的,不可能得到或者计算它的地址)。一般不需要声明为这两个类型,由编译器自动优化。

5、static 静态关键字

   a)static修饰的静态变量,在其作用域外是不可访问的,但是他会一直保存着值,存储在静态区域。 

   b)如果声明为static的文件全局变量或者全局函数,则其它文件不能访问这个变量。

   c)  类中的static函数表示该函数是属于类的,可以用类名来调用该函数。

   原理阐述:c/c++有两种连接方式(内部连接和外部连接)。

   a)内部连接意味着只对变编译的文件创建存储空间。用内部连接,别的文件可以实用相同的标识符或全局变量,连接器不会发现冲突。在c/c++中内部连接是由关键字static指定的。

   b)外部连接意味着为被编译过的文件创建一片单独的存储空间。一旦创建存储空间,连接器必须解决所有对这片存储空间的引用。全局变量和函数名都可以是外部连接。通过关键字extern声明,可以从其它文件访问这些变量和函数。c中默认的变量和函数都是外部连接的,只有强制为static的变量或者函数才属于内部连接。

   在c中,不需要用extern来定义变量或函数,但是在C++中对于const有时需要使用(因为C++对于const变量默认是内部连接的,而C默认是外部连接的)。

6、const常量关键字

7、volatile变量关键字

8、位运算符

   位运算符只适应于整形char、int、long,不适应于float等;因为float使用一种特殊的内部格式。

   与运算符:&;  

   或运算符:|;

   异或运算符:^;

   非运算符:~;

   左移位运算符:<<;   10<<10;//左移10位;

   右移位运算符:>>;

   如果移位运算符后面的值比左边的操作数的位数大,则结果是不定的。如果左边的操作数是无符号的,右移是逻辑移位,所以最高位补零。如果左边的操作数是有符号的,右移可能是也可能不是逻辑移位。

9、struct 结构体在C文件中,声明变量必须使用struct structName;而在C++文件中,声明只需要structName或者struct structName;

10、C++允许将任何类型的指针附给void*,但是不允许void指针赋给任何其它类型的指针;

       C允许将任何类型的指针赋给void*,也允许void*赋给任何指针;

11、C/C++允许重声明函数,只要两个声明匹配即可,但是都不允许重声明结构。

12、不要在头文件中使用“using namespace std;”这种类型的引用。

13、struct X;

       void FriendFun(X *);//前面只是X的声明,在这里只能传递X地址,不能传递对象X,因为编译器知道如何传递一个地址,但是如果要传递对象的话,则编译器需要知道对象中的属性和行为,必须把函数的声明放在X实现的后面。

       struct X{

          friend struct Z;//作为友元的同时,也是一个声明,然后下面再实现这个struct。函数也一样;

       };

      struct Z{};

14、struct中嵌套struct结构只能访问public成员,不能访问private成员,所以必须使用friend;结构的定义必须与friend声明分开,否则编译器将不把它看作成员;如下面的规则所述;

     struct Holder{

         struct Pointer;

         friend Pointer;

         struct Pointer{

};

     };    

15、访问说明符(private、public、pretected),他们并不影响这个结构创建的对象,程序开始运行之前,所有的访问说明信息都消失。访问说明信息通常是在编译期间消失的。在程序的运行期间,对象就变成了一个存储区域。

16、句柄类。减少重复编译的技术是:句柄类;

//Handle.h

class Handle{

struct Cheshire;

Cheshire* smile;

public:

  void initialize();

void cleanup();

int read();

void change(int );

};

//Handle.cpp

struct Handle::Cheshire{

int i;

};

void Handle::initialize()

{

smile  = new Cheshire;

smile->i = 0;

}

......

//如上面所述,如果改变了Cheshire的组成,唯一要重新编译的是Handle.cpp,因为头文件并没有修改;其它引用这个头文件的地方都不需要重新编译;


17、类型转化

  c++的显式转化:

    a、static_cast 用于良性和适度良性转换,包括不用强制转化(例如自动类型转化)

    b、const_cast 对const和volatile之间的转化。

    c、reinterpret_cast  转换为完全不同的意思。为了安全使用它,关键必须转换回原来的类型。转换成的类型一般只能用于位操作,否则就是位了其它隐藏的目的。这是所有转化中最危险的

   d、dynamic_cast 用于类型安全的向下转化。


 

原创粉丝点击