一、从C到C++(一)bool类型、const限定符、结构体内存对齐、重载、默认值形参

一、  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是很常用的,例如:
#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)、带默认值的形参

    函数声明或者定义的时候,可以给形参赋一些默认值。调用函数时,若没有给出实参,则按指定的默认值进行工作

    函数没有声明时,在函数定义中指定形参的默认值

    函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值

    重载的函数使用默认值,可能会产生二义性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值