c++中const用法总结

        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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值