- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7.结构体(c和c不同)
2015.3.9 上课内容
一、C与C++ 不同之处
bool 类型
逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节。
声明方式:bool result; result=true;
可以当作整数用(true一般为1,false为0)把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false,注意会发生截断。
const 限定符
(1)、用const给字面常量起个名字(标识符),这个标识符就称为标识符常量;因为标识符常量的声明和使用形式很像变量,所以也称常变量。定义的一般形式:const 数据类型 常量名=常量值; 数据类型 const 常量名=常量值;例如: const ?float ?PI=3.14159f;注意事项:
常变量在定义时必须初始化;
常变量初始化之后,不允许再被赋值;
正如我在这里所说,其实加了关键字const只是提示编译器这个变量是常量,如果我们在接下来的操作中试图更改它,编译器会报错,而并不是真正的常量。
(2)、const 与 #define
const定义的常量与#define定义的符号常量的区别:
const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换
const定义的常量在编译/运行时确定初值,而#define定义的常量是在预编译时进行替换,不分配内存。
作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然也可以在某个地方用#undef取消
#define定义的常量,容易产生副作用:
//Effective C++ 3rd的一个例子。#define CALL_WITH_MAX(a,b) f((a) (b) ? (a) : (b))int a = 5;int b = 0;CALL_WITH_MAX(++a, b); //a被累加二次CALL_WITH_MAX(++a, b+10); //a被累加一次在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”
此外,定义常量还可以用enum,在c++ 中尽量用const、enum替换#define定义常量,用inline 替换带参数的宏定义;但 #define 在底层编程中是必不可少的,下面举个例子:
1234567891011121314 #includeiostreamusing?namespace?std;#define?STR(a)?#a#define?CAT(a,b)?a##bint?main(void){????int?xy?=?100;????cout??STR(ABCD)??endl;?//?#ABCD?=?ABCD????cout??CAT(x,?y)??endl;?//?x##y?=?xy????return?0;} 如果是完全的c++ 菜鸟,这里还得稍微解释一下细节,iostream 是c++标准库的一个io流头文件,跟C语言不太一样的是一般没有.h 后缀,using namespace 表示命名空间,简单理解就是统一的函数前缀,类比pthread库如pthread_mutex_init, pthread_mutex_lock 用c++ 方式来表示可能是?pthread::mutex::lock。 cout是输出流对象,操作符在C语言中是左移位运算操作符,在这里被重载成输出操作符,之所以能并列输出是因为如coutxxx 返回的是cout 的引用,以后还会再提。参数宏定义的意义就很清楚了,查看下输出即可。
我们知道printf函数带有可变参数,函数式宏定义也可以带可变参数,同样是在参数列表中用...表示可变参数。例如:
?C++ Code?
123456 #define?showlist(...)?printf(#__VA_ARGS__)#define?report(test,?...)?((test)?printf(#test):\????????????????????????????????printf(__VA_ARGS__))showlist(The?first,?second,?and?third?items.);report(x??y,?x?is?%d?but?y?is?%d,?x,?y); 预处理之后变成:?
C++ Code?
12 printf(The?first,?second,?and?third?items.);((x??y)???printf(xy)?:?prin
文档评论(0)