一、从C到C++(一)bool类型、const限定符、结构体内存对齐、重载、默认值形参
2014-12-01 21:28
381 查看
一、 bool类型
取值为true或者false,可以当做整数用,在不用编译器实现不同。
二、 const限定符
(1)、用const给字面常量起个名字(标识符),这个标识符就称为标识符常量,const修饰的标示符常量必须在定义的时候必须初始化,而且初始化之后不能再重新赋值。
(2)、const和define的比较
const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换
const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。
作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然也可以在某个地方用#undef取消
定义常量还可以用enum,尽量用const、enum替换#define定义常量。
(3)、const修饰指针
const修饰指针的时候,根据const位置的不同,产生的效果也不同。
const int *p,const在*左边,表示*p是常量,由*p不能更改指针指向内容,但是能改变指针指向.
int * const p,const在*右边,表示指针p是常量,不能更改指针指向,但是能改变指针指向的变量的值。
(4)、#define
在进行上层编程的时候,常量定义或者函数定义不推荐使用#define,因为#define单纯的替换容易产生副作用。但是在底层编程中#define是很常用的,例如:
(5)、C和C++ const之比较
那么C语言和C++的const有什么不同呢,C语言中const变量是只读变量,有自己的存储空间,其值在运行的时候初始化。
C++中的const常量可能分配存储空间,也可能不分配存储空间,C++在编译的时候碰见常量声明时,在符号表中放入这个常量,若发现使用此const常量则直接以符号表中的值替换,编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间。也就是以下两种情况才会给const常量分配空间:
对const常量取地址的时候
const常量为全局变量,需要在其他文件使用的时候
三、内存对齐
为了寻址方便,编译器为每个“数据单元”按排在某个合适的位置上,这就是内存对其。C、C++语言非常灵活,它允许你干涉“内存对齐”
(1)、如何对齐
a)第一个数据成员放在offset为0的位置
b)其它成员对齐至min(sizeof(member),#pragma pack所指定的值)的整数倍。
c)整个结构体也要对齐,结构体总大小对齐至各个成员中最大对齐数的整数倍。
d)#pragma pack(n) 来修改,#pragma pack() 取消修改
四、C++增加的运算符
(1)、::域运算符,作用:类访问自己的成员,访问重名的全局变量
(2)、new,delete运算符用于分配和释放堆空间,例子:
new,delete用于对象上:
new一个新对象,内存分配(operator new)调用构造函数
delete释放一个对象,调用析构函数,释放内存(operator delete)
五、重载,name managling 和extern “C”
(1)、重载
相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载overload,函数重载又称为函数的多态性
函数重载不同形式:
形参数量不同
形参类型不同
形参的顺序不同
形参数量和形参类型都不同
调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数
(2)、name managling
C++为了支持重载,需要进行name managling,extern “C”实现C与C++混合编程,如下:
函数声明或者定义的时候,可以给形参赋一些默认值。调用函数时,若没有给出实参,则按指定的默认值进行工作
函数没有声明时,在函数定义中指定形参的默认值
函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值
重载的函数使用默认值,可能会产生二义性。
取值为true或者false,可以当做整数用,在不用编译器实现不同。
二、 const限定符
(1)、用const给字面常量起个名字(标识符),这个标识符就称为标识符常量,const修饰的标示符常量必须在定义的时候必须初始化,而且初始化之后不能再重新赋值。
(2)、const和define的比较
const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换
const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。
作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然也可以在某个地方用#undef取消
定义常量还可以用enum,尽量用const、enum替换#define定义常量。
(3)、const修饰指针
const修饰指针的时候,根据const位置的不同,产生的效果也不同。
const int *p,const在*左边,表示*p是常量,由*p不能更改指针指向内容,但是能改变指针指向.
int * const p,const在*右边,表示指针p是常量,不能更改指针指向,但是能改变指针指向的变量的值。
(4)、#define
在进行上层编程的时候,常量定义或者函数定义不推荐使用#define,因为#define单纯的替换容易产生副作用。但是在底层编程中#define是很常用的,例如:
#define STR(a) #a <==> STR(ABC) = “ABC”//把参数转化为字符串 #define CAT(a,b) a##b CAT(a,b) = ab //连接两个字符串,根据这个字符串可以定义变量
(5)、C和C++ const之比较
那么C语言和C++的const有什么不同呢,C语言中const变量是只读变量,有自己的存储空间,其值在运行的时候初始化。
C++中的const常量可能分配存储空间,也可能不分配存储空间,C++在编译的时候碰见常量声明时,在符号表中放入这个常量,若发现使用此const常量则直接以符号表中的值替换,编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间。也就是以下两种情况才会给const常量分配空间:
对const常量取地址的时候
const常量为全局变量,需要在其他文件使用的时候
三、内存对齐
为了寻址方便,编译器为每个“数据单元”按排在某个合适的位置上,这就是内存对其。C、C++语言非常灵活,它允许你干涉“内存对齐”
(1)、如何对齐
a)第一个数据成员放在offset为0的位置
b)其它成员对齐至min(sizeof(member),#pragma pack所指定的值)的整数倍。
c)整个结构体也要对齐,结构体总大小对齐至各个成员中最大对齐数的整数倍。
d)#pragma pack(n) 来修改,#pragma pack() 取消修改
四、C++增加的运算符
(1)、::域运算符,作用:类访问自己的成员,访问重名的全局变量
(2)、new,delete运算符用于分配和释放堆空间,例子:
int*p = new int(5); delete p; int *p2 = new int[10]; delete[] p2;//释放数组空间一定要加[]</span>
new,delete用于对象上:
new一个新对象,内存分配(operator new)调用构造函数
delete释放一个对象,调用析构函数,释放内存(operator delete)
五、重载,name managling 和extern “C”
(1)、重载
相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载overload,函数重载又称为函数的多态性
函数重载不同形式:
形参数量不同
形参类型不同
形参的顺序不同
形参数量和形参类型都不同
调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数
(2)、name managling
C++为了支持重载,需要进行name managling,extern “C”实现C与C++混合编程,如下:
#ifdef __cpluscplus extern “C” { #endif ...//函数声明 #ifdef __cpluscplus } #endif(3)、带默认值的形参
函数声明或者定义的时候,可以给形参赋一些默认值。调用函数时,若没有给出实参,则按指定的默认值进行工作
函数没有声明时,在函数定义中指定形参的默认值
函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值
重载的函数使用默认值,可能会产生二义性。
相关文章推荐
- 为什么要用C++之 :为什么要用bool类型
- 第02章 CORE C++_控制语句_选择_循环_分支_跳出_函数_声明_形参_返回值_重载_递归
- C++中重载数组下标访问操作符[ ] 和 赋值操作符 = ,* 和 -> 操作符和取反 !以及转化操作符bool和void*
- C++语法基础--模板实参推断,模板类型形参的实参的受限转换,模板实参推断与函数指针
- C++函数中string类型的形参声明方…
- Safe Bool idiom C++类型的bool转换操作
- C++里用类重载数据类型模板
- C++中为什么使用bool类型
- C++重载类型转换操作符
- c++类型形参的实参的受限转换
- 为什么要用C++之 :为什么要用bool类型
- c++类型重载 : 避免对指针和数字重载
- C++中形参与const形参的函数重载问题。
- c++如何对结构体作为形参设置默认值
- C++ trick之重载类型转换操作符 “orthodox”技术
- C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
- C++重载类型转换操作符
- C++重载类型转换操作符(type cast operator
- C++模版学习笔记 非类型形参
- 由C++ bool类型想到的一些事情