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

c++中const用法总结

2014-08-01 13:42 169 查看
const关键字在c++中的用法很普遍,总结了一下,大致有这些用法。

1.阻止一个变量被改变,使用const修饰,变量成为常量,因为以后不能修改它,所以定义时必须初始化。比如const int number = 512。这和c语言中宏有点类似,都是定义常量的,但是它们也有不同之处:宏只是做简单的字符替换,在预处理阶段就被替换了,没有数据类型也不做类型检查,并且不会占用存储空间;const是在编译运行时使用,有数据类型,在编译期间做类型检查,并且会被分配存储空间。在c++程序中,应该使用const代替#define。

2.用来修饰指针:①指向const对象的指针( 常量指针)比如const int *p;我们从右往左理解,p是一个指针变量,它保存是的是int类型的常量对象,说明指针p是可变的,它指向的对象不可变;②const指针(指针常量)比如int num = 0; int *const p = #还是一样,从右往左理解,p是一个const类型的指针,它指向的是一个int类型的对象,说明指针p不可变,它指向的对象是可变的;③指向const对象的const指针 比如const double
pi = 3.1415; const double *p = π 说明指针p是不可变的,它指向的对象也是不可变的。

3.用来修饰函数形参和返回值。①const修饰形参,表明它是一个输入参数,在函数内部不容许改变它的值。ps:对于输入参数的指针形参应该尽量被声明为const,调用的时候可以传递指向const对象的指针也可以传递指向非const对象的指针。如下面的代码:

#include <iostream>

using namespace std;

void test_const(const double*);

int main() {

//pi1是非const对象
double pi1 = 3.1415;
test_const(&pi1);

//pi2是const对象
const double pi2 = 3.1415;
test_const(&pi2);

system("pause");

return 0;
}

void test_const(const double *d_ptr) {
cout << *d_ptr << endl;
}
输出结果:


结果表明使用指针形参时用const修饰(输入参数)能力要强一些,而且还能防止意外的改变该指针指向的内存单元。使用引用传递时(输入参数),应该使用const修饰,不产生临时对象,可以提高效率,当然使用const修饰后既可以接受const对象也可以接受非const对象。

②const修饰返回值。使其返回值不能为左值。看下面的代码说明

#include <iostream>

using namespace std;

const int& test_const_return(int&, int);

int main() {

int i = 9;
int &r_i = i;

//当我们用引用返回左值时,若不加const修饰,由于时左值,可以赋值,在此函数中会改变第一个引用形参的值,引起错误,为了防止这种情况,我们加上const就可以防止引用返回值被修改,防止函数作为左值
//test_const_return(r_i, 1) = 11;

cout << "max: " <<  test_const_return(r_i, 1);

system("pause");

return 0;
}

const int& test_const_return(int &i, int j) {
return i >= j ? i: j;
}
4.const修饰成员函数。任何不会修改类中数据成员变量的成员函数都应该声明为const类型。也就是说const成员函数中是不能改变成员变量的值,那我们确实需要改变怎么办呢,c++中有个不常用的关键字mutable就可以帮我们实现,表明此数据成员变量是可变的。而且const成员函数不能调用非const成员函数。看看下面的代码
#include <iostream>

using namespace std;

class A {
public:
void set(int i);
int get();
int get_count() const;

private:
int m;
mutable int v_m;			//可变的变量,这样就可以在const成员函数中修改此变量了
};

int A::get_count() const {

++m;						//编译错误,const成员函数中试图修改成员变量
get();						//编译错误,const成员函数中试图调用非const成员函数

++v_m;						//编译通过,因为v_m变量类型是mutable

return m;
}

看看编译结果:



从上面可以看出虽然const只是c++语法中的一个关键字,但是它的作用之广用处之大已经很明了,要想写出健壮高效的c++代码,const是必不可少的,对于const需要掌握。

上面出现了一个词叫左值,这在c++中很常见,简单解释一下。左值可以出现在赋值语句的左边或者右边,也就说左值其实是可以作为右值使用的。而右值是只能出现的赋值的右边。列举了几个简单的例子:

#include <iostream>

using namespace std;

int main() {

int a = 1;						//a是左值,数字常量都是右值
char str[] = "hello, world";	//str[i]是左值,“hello, world”是右值

string("hello, world");			//是右值

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