【C++自我精讲】基础系列二 const

【C++自我精讲】基础系列二 const
0 前言

分三部分:const用法、const和#define比较、const做用。安全

1 const用法

const常量:const能够用来定义常量,不可改变,const常量在定义时必须初始化(extern修饰时是特例)。函数

//const常量
const int Number = 100;
extern const int Number; 

 const指针:spa

  1)const出如今*号左边,表示被指物是常量(不能够改变);注意:const写在类型以前和写在类型以后且*号以前是同样的。指针

  2)const出如今*号右边,表示指针自身是常量(不能够改变);code

  3)const出如今*号两边,表示被指物和指针二者都是常量(不能够改变)。对象

//const指针
char name[] = "joinclear";
char* pName = name;             //指针和所指物均可以改变
const char* pName = name;       //指针能够改变,指针所指物不能够改变
char const* pName = name;       //同上
char* const pName = name;       //指针不能够改变,指针所指物能够改变
const char* const pName = name; //指针和所指物都不能够改变

 const引用:初始化右值通常只是个常量,因此只有常量引用能够有初始化右值。blog

//const引用
int i = 100;
int &j = i;    //引用
int &j = 200;  //错误,引用不能改变右值
const int &k = 200;  //const引用能够改变右值

const函数形参:const只能修饰输入参数,不能修饰输出参数。内存

  1)对于内部数据类型的输入参数,不必将“值传递”方式改成“const引用传递”,由于“值传递”是,函数会自动产生临时变量用于复制该参数,无需const。作用域

void Fun(int i)       //OK
void Fun(const int i) //不必

  2)当输入参数是“指针传递”是,为了防止函数体内改变此指针指向的值,能够加const修饰。编译器

void StringCopy(const char *strSource); //strSource指向值不能改变

  3)对于非内部数据类型的输入参数,应将“值传递”方式改成“const引用传递“。

void Func(CTest a);        //函数体内会产生CTest的临时对象用于复制a,临时对象又会通过构造、复制、析构,很耗时
void Func(CTest &a);       //引用,不产生临时对象,但"引用传递"有可能改变a
void Func(const CTest &a); //加const不会改变a

const函数返回值:const修饰函数返回值。

  1)返回值是“值传递”方式,不用加const修饰。由于函数会把返回值复制到外部临时的存储单元,加const修饰不必。

int Fun(int i)        //OK
const int Fun(int i)  //不必

  2)返回值是“指针传递”方式,能够加const修饰。意思为函数返回值指针所指内容不能改变,此时此返回值也只能赋给const修饰的同类型指针。

const char * GetString(void);
const char *str = GetString();

const类成员变量:只在某个对象生存期内是常量,对于整个类是可变的,由于类能够建立多个对象,不一样的对象其const类成员变量的值是能够不一样。

  1)const类成员变量,不能在类声明中初始化。

class A
{
    const int size = 100;  //错误
};

  2)const类成员变量,只能在类构造函数的初始化表中进行初始化。

class A
{
    A(int size);     
    const int size ; 
};
A::A(int i) : size(i) //构造函数初始化列表
{
    ...
}

const类成员函数:当类成员函数,不会修改数据成员时应该声明为const成员函数。

class A
{
public:
    int GetNum() const; //const成员函数
private:
    int num_;
};

int A::GetNum() const
{
    num_ = 100;; // 错误,num_不能改变
    return num_;
}
2 const和#define比较

  1)const常量有数据类型,编译器能够对前者进行类型安全检查;而#define常量没有数据类型,编译器只进行字符替换,没有类型安全检查,而且在字符替换可能会产生意料不到的错误(边际效应)。

  2)const可定义局部变量,做用域仅限于函数体内;#define常量,即便在函数体内,做用域也是全局的,为从定义处到文件结束,除非用#undef取消定义。

3 const做用

  1)定义const常量,不可改变,可以节省内存空间,代替#define。

  2)编译器能进行类型安全性检查,消除部分隐患。

  3)能够保护被修饰的内容,防止意外修改,可以加强程序的健壮性。

  4)可以提升效率,安全。

相关文章
相关标签/搜索