分类: C/C++
2014-11-02 09:31:46
符号表是编译器在编译过程中产生的关于源程序中语法符号的数据结构:
如常量表、变量名表、数组名表、函数名表
符号表是编译器自用的内部数据结构,符号表不会进入最终产生的可执行程序中。
只有用字面量初始化的const常量才会进入符号表:
对const常量进行引用会导致比编译器为其分配空间,虽然const常量被分配了空间但这个空间的值不会被使用,使用其他变量的初始化的const常量仍然是只读变量。
被volatitle修饰的const常量不会进入符号表:退化为只读变量每次访问都从内存中取值
Const引用的类型与初始化变量的类型:
相同:使初始化变量成为只读变量
不同:生成一个新的只读变量其初始值与初始化变量相同
在编译期间不能直接确定初始值的const量,都被作为只读变量处理。
指针与引用的区别:
指针是一个变量,其值为一个内存地址,通过指针可以访问对应的内存地址中的值;
引用只是一个变量的新名字,所有对引用的操作(赋值、取地址等)都会传递到其引用的变量上;
指针可以被const修饰成为常量或者只读变量;
Const引用使其引用的变量具有只读属性;
指针就是变量,不需要初始化,也可以指向不同的地址;
引用天生就必须在定义时初始化,之后无法再引用其他变量。
引用的本质就是指针常量?
从使用c++语言的角度来看,引用于与指针常量没有任何的关系,引用是变量的新名字,操作引用就是操作对应的变量;从c++编译器的角度来看,为了支持新概念引用,必须要一个有效的解决方案,在编译器内部使用指针常量来实现引用,因此引用在定义时必须初始化。
C++编译器对字面量的处理方式:
整数型字面量的默认类型为int,占用4字节
浮点型字面量的默认类型为double,占用8个字节
字符型字面量的默认类型为char,占用1个字节
字符串型字面量的默认类型为const char* ,占用4个字节。
当使用字面量对变量进行初始化或赋值时,
无溢出产生:编译器对字面值进行默认类型转换,
产生溢出:编译器会做截断操作,并产生警告。
深入理解重载规则:精确匹配实参,通过默认类型转换匹配实参,通过默认参数匹配实参。
三条规则会同时对已存在的重载函数进行挑选: 当实参为变量并能够精确匹配形参时,不再进行默认类型转换尝试,当实参为字面量时,编译器会同时进行精确匹配和默认类型转换的尝试。
extern C 告诉c++编译器将其中的代码进行c方式的编译,c方式的编译主要按照c语言的规则对函数名进行编译,函数名经过编译后可能与源码中的名字有所不同,c++编译器为了支持重载,函数名经过编译后会加上参数信息,因而编译后的函数名与源码中完全不同,c编译器不会在编译后的函数名中加上参数信息。
extern C 中的重载函数经过c方式编译后将得到相同的函数名,因此extern C中不允许重载函数,但extern C中的函数可以与extern C外的函数进行重载。