C++const详解

const与宏定义的区别

const int r=100; 或 int const  r=100

标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,编译器经过类型检查后直接用100在编译时替换。

#define PI 3.1415926

  • (1) 编译器处理方式不同

–define宏是在预处理阶段展开。

–const常量是编译运行阶段使用。

  • (2) 类型和安全检查不同

–define宏没有类型,不做任何类型检查,仅仅是展开。

–const常量有具体的类型,在编译阶段会执行类型检查。

  • (3) 存储方式不同

– define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

–const常量会在内存中分配(可以是堆中也可以是栈中)。

const与指针

  • 1.const int *r=&x; //声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何地址的常量。
  • 2.int const *r=&x; //与用法1完全等价,没有任何区别。
  • 3.int * const r=&x; //声明r为一个常量指针,他指向x,r这个指针的指向不能被修改,但他指向的地址的内容可以修改。
  • 4.const int * const r=&x; //综合1、3用法,r是一个指向常量的常量型指针。

const与函数

  • 1.void Fuction1 ( const int r ); //此处为参数传递const值,意义是变量初值不能被函数改变
  • 2.const int Fuction1 (int); //此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用),对于用户自定义类型,返回值是常量是非常重要

const与类

  • 1.const对象 const Point px(10,10);//定义const对象,编译器要保证这个对象在其生命周期内不能够被改变。
  • 2. const的成员变量,只能在构造函数里使用初始化成员列表来初始化,试图在构造函数体内进行初始化const成员变量会引起编译错误。初始化成员列表形如: 2.X:: X ( int ir ): r(ir) {} //假设r是类X的const成员变量
  • 3.const成员函数。对于常对象的一切非const成员函数的调用,编译器为了保证对象的const特性,都会禁止并在编译期间报错。所以如果你想让你的成员函数能够在const对象上进行操作的话,就要把这个函数声明为const成员函数。假如f( )是类中的成员函数的话,它的声明形如: int f( ) const; //const放在函数的最后,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法 注意:类的构造和析构函数都不能是const函数。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注