总结一下在非类中使用const关键字定义常量时的初始化问题,亲测VS2015。顺便记录#define宏和typedef的区别。

1 首先对const声明的常量的初始化做简单小结:

 int w1 = , w2 = , w3 = ;

 int * const p1 = &w1, P1_1; //p1:指针常量,指针是常量;
//p1_1:int型变量
int const * p2, P2_2 = ; //p2:常量指针,指向常量的指针;
//p2_2:int const型
const int * p3, P3_3 = ; //p3:常量指针,指向常量的指针;
//p3_3:const int型
const int temp = ; //temp:const int,即整形常量

int * const p1 = &w1;  //指针常量,必须在声明时对其进行初始化,否则编译无法通过

  为指针常量,即指针是常量。既然指针是常量,那就当然是必须在声明时对其进行初始化。在它的生存期内,其指向的地址是不变的(++p1,这种操作肯定就是错误的);

  但是,其指向的值是可以改变的,可以对其进行赋值操作,例如:*p1 = 12;

  简言之:指针不能改变,指向的值可以改变。

int const * p2;//常量指针,即指向常量的指针,声明和初始化可以分开,p2 = &w1

  指针可以改变,例如++p2,p2++等。但是其指向的值不能改变,*p2 = 13这当然就会出错了。

int const * 和 const int *等价。

const int temp = 17; //定义int型常量,那就必须要在声明时对其进行初始化赋值,并且后面不能再改变。

注意:当用逗号“,”一次定义多个参数时,对于存在指针符的,除了第一个参数外,后面的参数类型都以指针符“*”左面的声明关键字为准。这也是我在初学c++时没有注意到的,但是很重要。详细见以上代码注释说明。

2 简要记录一下#define和typedef的区别

以此为例:

 #define pint int * //在预处理阶段,代码中的pint会被替换为int*
typedef int * PINT;//相当于重新定义了一个数据类型PINT,PINT和int*等价

1  #define宏定义发生在预处理阶段,它只进行简单机械式的字符替换,而不进行任何检查。typedef的执行发生在编译阶段,因此有类型检查;

2  #define可以为数据类型取别名、定义常量、作为编译开关、定义简单的函数等。而typedef用来定义类型的别名,与struct结合使用等;

3  #define没有作用域的限制,对于一个源文件,只要是前面定义过的宏(无论是在函数体内还是外),在后面都可以使用。而typedef有作用域的限制,例如在同一个源文件的函数体A中定义过,那么在函数体A之外,它就是未定义的。

#define pint int *
typedef int * PINT; int w1 = , w2 = , w3 = , w4 = ; const pint p1, p2 = ;//等价于:const int* p1; const int p2 = 75;
pint const p3=&w3, p4;//等价于:int* const p3 = &w3; int p4; const PINT P1=&w1, P2=&w2; //类型都等价于: int* const
PINT const P3=&w3, P4=&w4; //类型都等价于: int* const

欢迎交流,整理不易,转载时请注明。

C++ —— 非类中使用const定义常量的初始化,以及#define和typedef的区别的更多相关文章

  1. PHP中define()和const定义常量的区别

    在PHP中可以通过define()和const两种方式定义常量可是在开发中我们应该什么时候用define()定义常量,什么时候用const定义常量? 这两种方式定义常量的主要区别是什么? 从5.3版本 ...

  2. 在php中define和const定义常量的区别

    define和const都可以用来定义常量,但是const定义常量的时候大小写敏感,而define可以通过设置第三个参数为true的时候来取消大小写敏感! 如图: 引用地址:点这里

  3. 【c++】类中的const成员

    const成员变量 举个例子 #include <iostream> using namespace std; class A { public: A(int size) : SIZE(s ...

  4. 为什么很多人使用#define而不是const定义常量

    众所周知,C语言一开始只有#define,C程序员用#define定义符号常量.但后来ANSI C加入了const限定符,而const应该比#define更好,为什么现在的C程序员还在大量使用#def ...

  5. C++ 类中的const关键字

    //类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是 ...

  6. (转载)php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗?

    (转载)http://s.yanghao.org/program/viewdetail.php?i=184313 php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗? class block ...

  7. 类中为什么要定义__init__()方法

    总结一下, 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合 学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1. ...

  8. Python: 类中为什么要定义__init__()方法

    学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...

  9. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

随机推荐

  1. ORM的补充

    之前学习的orm的操作类似: create delete update filter/all exclude values values_list get first last order_by 补充 ...

  2. [翻译] CNPGridMenu

    CNPGridMenu CNPGridMenu is a Mailbox style grid menu with a blurred background for iOS 7 & iOS 8 ...

  3. 乘风破浪:LeetCode真题_011_Container With Most Water

    乘风破浪:LeetCode真题_011_Container With Most Water 一.前言 下面我们继续进行编程练习,可以说对于实际问题的活学活用是非常重要的.比如我们这次的题目,就需要从中 ...

  4. redis3.2.9编译安装

    Redis 3.2.9 安装 Redis 3.2.9 编译安装 1,   安装相关软件包 2,   下载redis源码包 wget http://source.goyun.org:8000/sourc ...

  5. 数据库相关文章转载(2) MySQL自带的性能压力测试工具mysqlslap详解

    PS:今天一同事问我有木有比较靠谱的mysql压力测试工具可用.其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开始的一 ...

  6. ZT 蓝牙的AVCTP协议笔记

    蓝牙的AVCTP协议笔记 (2013-07-31 08:52:41) 转载▼ 标签: bluetooth avctp command response 分类: Bluetooth 1.概述     A ...

  7. 今天开始每天一点ffmpeg知识。千里之行 。

    今天开始每天一点ffmpeg知识.千里之行 .

  8. 5、Python,enumerate用法

    1.enumerate()是python的内置函数 2.对于一个可迭代(iterable)/可遍历的对象(如列表,字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 3.多用 ...

  9. 浅谈 JavaScript 中的继承模式

    最近在读一本设计模式的书,书中的开头部分就讲了一下 JavaScript 中的继承,阅读之后写下了这篇博客作为笔记.毕竟好记性不如烂笔头. JavaScript 是一门面向对象的语言,但是 ES6 之 ...

  10. Epoll为我们带来了什么

    libevent中用到的,epoll是Linux下多路复用IO接口select/poll的增强版本.网上找到的介绍资料,无法标明来源. Q:网络服务器的瓶颈在哪? A:IO效率. 在大家苦苦的为在线人 ...