您的位置:首页 > 编程语言 > C语言/C++

C++::const的使用法总结

2017-04-08 18:39 239 查看

摘要

const 是C++一个强大的工具,可以帮助我们提高程序的健壮性,减少运行期可能发生的错误,但是,对于初学者来说,const也是相对难以掌握的,我将对const进行一下总结。

const 变量

普通的内置对象

const int i=0;
const int& j=i;


const指针

const int *i = new int[30];
//const 修饰的是(*i), 所以(*i),也就是值本身不可变,也就是一个low-level const

int * const i = new int[30];
//const 修饰的是(i), 所以(i),也就是指针本身不可变,也就是一个top-level const


const 返回值函数

by-value

class v{}
const v func(int i){
return v(i); //返回一个对象,编译器会进行优化
}


by-reference

class v{}
const v& func(int i){
v c(i);
return c; //很蠢,因为c在离开该函数后已经被析构了
}


by-pointer

class v{}
const v* func(int i){
return new v(i); //也很蠢,开发者还要记得delete它
}


class与const

在这一章节中,将重点介绍class,也就是类与const的一些应用

首先,我们定义一个类constTest作为我们测试的舞台

class constTest
{
public:
const int c_int;
int _int;

public:
constTest();
explicit constTest(int);

int get_cInt() const;
int<
4000
/span> get_int();
};


const 成员变量

const成员变量的声明很简单,只需要在成员变量类型前加上const即可

const int c_int;


由于const成员变量的值需要在对象初始化阶段时被定义,因此const成员变量必须通过成员变量赋值列来完成定义

constTest::constTest(int i):c_int(i),_int(i)
{}


这种写法十分高效,比以下写法好的多

constTest::constTest(int i):c_int(i)
{
this->_int=i;
}


但是要注意的是赋值的顺序最好与声明的顺序一致,防止某些构造函数参数间的依赖性:

class A{
public:
A(int a):a(a);
}
class C{
public:
C(A a):a(a);
}

class B{
public:
int num_a;
A a;
C c;
B(int);
}

B::B(int num):C(this->num_a),num_a(num),A(this->C) //这句话有bug哟~
{}


const 成员函数

在class中声明const成员函数,只需要在函数后加一个const即可:

int get_cInt() const;


被声明为const的成员函数:

可以访问所有的成员变量;

不可以对成员变量进行赋值;

不可以调用非const的成员函数(因为非const的成员函数有权利对成员变量进行赋值)

没有被声明为const的成员函数:

可以访问所有的成员变量;

可以对非const成员变量进行赋值;

可以调用所有的成员函数

const对象

我们构造一个普通对象和一个const对象

const constTest c1(1);
constTest c2(1);


被声明为const的对象

可以访问所用的成员变量

不可以进行任何赋值

不可以调用非const成员函数

没有被声明为const的对象

可以访问所用的成员变量

可以调用所有成员函数

参考文献

《Effective C++》

《More Effective C++》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: