一早上由于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的构造函数展开