跟我一起学C++之从C到C++(const与#define)

1.const定义的常量与#define定义的符号常量的区别

(1)const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换

(2)const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。

(3)作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然也可以在某个地方用#undef取消

2.定义常量还可以用enum,尽量用const、enum替换#define定义常量,高层次编程尽量用const、enum inline 底层框架用#define笔记灵活。

3. #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被累加二次 因为++a取值为6,所以应该是a,此时a又被累加了一次
	CALL_WITH_MAX(++a, b+10);	//a被累加一次,++a的取值是6,小于10,所以取值应该是b此时没有调用a,所以a是6
	//在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”

4.定义常量还可以用enum,尽量用const、enum替换#define定义常量。

代码示例:

#include <iostream>
using namespace std;

#define STR(a) #a //将转换成字符串 a 也就相当于"a"
#define CAT(a,b) a##b //这个很蛋疼,不好理解

int main(void)
{
	int xy = 100;
	cout<<STR(ABCD)<<endl;			//#ABCD <=> "ABCD"
	cout<<CAT(x, y)<<endl;			//x##y  <=> xy
	return 0;
}

时间: 2024-10-11 05:53:03

跟我一起学C++之从C到C++(const与#define)的相关文章

素数检测杂谈

最开始我们学到的是这种朴素的写法: (define (prime? n) (cond [(or (= n 2) (= n 3)) #t] [(even? n) #f] [else (prime-test-loop n)])) (define (prime-test-loop n) (let ((top (ceiling (sqrt n)))) (let iter ((start 3)) (cond [(> start top) #t] [(= (mod n start) 0) #f] [else

C++概念

1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行

东方14ACM小组 15:Challenge 11

Challenge 11 查看 提交 统计 提问 总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)修改数列中的一个数 (2)求某次操作后连续一段的和 输入 第一行两个正整数N和M.第二行N的整数表示这个数列.接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来两个整数x和y,表示把x位置的数修改为y:若该字符为'Q',则表示一个询问操作,接下来三个整

面霸不容易--且面且珍惜

面霸不容易--且面且珍惜 前序: 找工作心态很重要,这是人生必经之历程.适当的跳槽有时会对个人的发展带来意想不到的收获. 但个人不建议频繁的跳,乱跳.平跳.一定要有主见要充分分析,不要人云亦云.千万别一时觉得工作太累啊.工资太少.出差太频繁.学不到东西,然后心血来潮就提出辞职.这是不成熟的表现,心态不好.太浮躁了.一定要三思而后行,然后注意的一点是,你在犹豫并未确定是否真要离职时千万不要将消息透露给一起上班的同事,这个不能疏忽. 借用网上的一段话: 从哪个行业入手,逐渐对该行业深入了解,不要频繁

P1243~P1247 线段树模板题总结

前言 这几天刚刚刷了5道线段树(水)题,现在来总结一下. 首先是犯的不少错误: 1.建树.更新函数没有return.这是最气的,每次最后程序错误查了半天也没查出来,最后发现是没有return.递归边界要return,递归边界要return,递归边界要return,重要的事情说三遍. 2.判断查找区间于线段的变量写反.听说这个是常犯错误. 然后说一下学线段树的收获.线段树的代码量的确多,很能练自己的思维,而且学的过程中简单的理解了一下#define的用处.线段树用来解决区间查询,区间修改都很方便,

笔记整理--C语言

linux下错误的捕获:errno和strerror的使用 - Google Chrome (2014/2/26 17:31:39) linux下错误的捕获:errno和strerror的使用 2011-08-09 13:44:12 经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因.这个时候使用errno这个全局变量就相当有用了.    在程序代码中包含 #i

const 用法详解

const用法详解 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1. 限定符声明变量只能被读 const int i=5; int j=0; ... i=j;   //非法,导致编译错误 j=i;   //合法 2. 必须初始化 const int i=5;    //合法 const int j;      //非法,导致编译错误 3. 在另一连接文件中引用co

C++新手之培养良好的编程风格

内功深厚的武林高手出招往往平淡无奇.同理,编程高手也不会用奇门怪招写程序.良好的编程风格是产生高质量程序的前提. 下面以C++为例,来给大家介绍. 一. 命名约定 有不少人编程时用拼音给函数或变量命名,这样做并不能说明你很爱国,却会让用此程序的人迷糊(很多南方人不懂拼音,我就不懂).程序中的英文一般不会太复杂,用词要力求准确.匈牙利命名法是Microsoft 公司倡导的[Maguire 1993],虽然很烦琐,但用习惯了也就成了自然.没有人强迫你采用何种命名法,但有一点应该做到:自己的程序命名必

C++面试必备,概念解析

1.C和C++中struct有什么区别? 1> C++中的struct类似于class,有变量,有构造函数.虚函数等,有继承,多态等类的特征: 2> C中的struct只有变量,不能有函数,但是可以有函数指针 2.C++中的struct和class有什么区别? 在C++中,两者区别不大,但是有2个主要的区别 1>. 继承权限:struct默认是public继承:class默认是private继承 2>. 访问权限:struct默认是public访问:class默认是private访