const总结

  一早上由于const的胡乱采用,调了很长时间bug,时间浪费,效率低下,感觉自己把这些弄成了以片浆糊,重新学习总结一下。

1.const常量

const int a=int const a都表明a的值是一个定值,在整个程序的运行中a的值不可以被改变,和宏定义#define差不多,但是宏定义还可以定义一个函数,const声明了类型;

2.const指针

1>指针常量 int *const p,const修饰p,也就是地址,所以说明指针所指向的对象不能改变,但是该对象的值可以改变;

2>常量指针const int *p,const修饰int,也就是指针所指向的值不能改变,但是指针的指向可以改变,常量指针也就是常量的指针;

3>指向常量的常指针const int *const p指针的指向和指向的值的大小都不可以改变 

那么,问题来了,什么时候我们需要用到指针???

1>函数传参

如果输入参数采用指针传参,加const修饰可以防止意外的改动该指针,起到保护的作用;

a.如果形参是非const非引用参数,则函数参数通过对应的实参实现初始化,函数本身对形参的修改不会影响到实参,实参可以是const型,也可以是非const型;

b.如果形参是const非引用参数,我们不可以改变实参的局部变量,所以实参可以是const型,也可以是非const型;

c.如果形参是非const引用参数,必须给函数传递类型完全一致的非const对象;

d.如果形参是const引用参数,实参可以是const型,也可以是非const型,但是非const有警告;

如果函数形参是引用,实参是指针,那么形参就要用const,不然编译不通过

#include<iostream>
using namespace std;
void show(string &a)
{
	cout<<a<<endl;
} 
int main()
{
	char *b="fgfhfgd";
	show(b);
	return 0;
}


10	8	
C:\Users\24864\Desktop\Untitled10.cpp	
[Error] invalid initialization of reference of type 'std::string& {aka std::basic_string<char>&}' from expression of type 'char*'

要是改成void show(const string &a)程序就可以运行;

2>指针和数组可以相互转换,但是指针比数组好的是指针可以实现复制和自增自减的功能;

3>自定义变量类型在作为形参传递时,需要有构造,复制,析构等过程,这些过程在时间和空间上消耗比较大,所以可以采用引用,引用只是一个变量的别名,不会进行新的内存分配和空间的占用,效率比较高,如果要求函数的实参不能改变,则需要在引用参数时加const来修饰,而指针,则是把保存这个指针的变量存入到内存中;

3.const数据成员

常数据成员只能初始化列表来获得初值,任何函数都不能对该成员赋值;

4.常成员函数

常对象只能调用常成员函数;

成员函数有this指针,this指针的指向不能修改,但是他的数据成员可以修改,若将其定义为常成员函数,则不可以修改成员函数;

const成员函数可以访问const数据,也可以访问非const数据,但是他们的值都不可以改变;

const成员函数中的const在声明和定义的时候都需要加;

const成员函数可以提高程序的可读性和安全性,一旦数据成员的值被修改,程序就不能运行,这就是我为什么做了一早上无用功的原因。。。。。

5.常对象

常对象的数据成员必须是常量,并且要有初始值,常对象可以保证其所有的成员都不被修改;

常引用可以看作为一个常对象;

若要修改常对象中的数据成员的值的时候,我们可以声明其类型为mutable;

6>举例

date(int y,int m,int d)
		{
			year=y;
			month=m;
			day=d;
			int year1=year-1;
			totaldays=year1*365+year1/4-year1/100+year1/400;
			if(isrunnian()&&month>2)
			totaldays=totaldays+1;
		}
void savingsaccount::settle(const date &date)
{
    double nianxi=acc.getsums(date)*rate/date.distance(date(date.getyear()-1,1,1));
    if(nianxi!=0)
    record(date,nianxi,"shuoming");
    else
    acc.reset(date,getbanlance());
}
167	81	C:\Users\24864\Desktop\银行存储问题.cpp	[Error] no match for call to '(const date) (int, int, int)'

就拿这个错误来说,我觉得由于settle函数中date定义为const类型,但是构造函数不是const类型,所以一直编译不通过,常数据成员要使用构造函数成员初始化列表进行初始化,但是我感觉这种解释不对,因为构造函数和析构函数是两种特例

后来在调试的时发现不是那里的问题,是由于distance(const date &d)中并没有将date的构造函数展开

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值