c++中的const总结

来源:互联网 发布:淘宝规则在哪里查看 编辑:程序博客网 时间:2024/06/05 10:52

1. const用来定义符号常量时要注意:

const 类型 name=value;

类型 const name=value;

符号常量声明时就要赋初值,而且在程序中不能改变它的值

2. const定义常引用:

const 类型 & 引用名

比如 void display (const int &r)

常引用做形参时,所引用的对象不能被更新,因此对应的实参不会被改变

如这个例子:

void display(const int& r)
{
cout<<r<<endl;

       //r=5;//尝试给r赋值改变他,会发生错误,即不能给常量r赋值,所以在调用这个函数时保证了不会改变实参传进来的值
};
int main()
{
int a=4;
display(a);
a=5;//这样是可以再重新调用display函数的
display(a);
}

3. const定义常对象:

类名 const 对象名,const也可以写在前面

比如 A const a(3,4);//A是类的名字,a是对象

常对象的数据成员值在对象的整个生存期间不能被改变,常对象和符号常量一样要进行初始化,且不能被更新

为了防止常对象里面的成员函数改变常对象的数据成员的值,规定常对象不能调用普通的成员函数,所以常对象的接口应该是特殊的成员函数,即常成员函数

4. 常成员函数:

成员函数 const

比如 void print () const;

常成员函数不能更新对象的数据成员,也不能调用常对象的非常成员函数的成员函数,保证了不会改变对象的数据成员的值

5.常数据成员

在数据成员前面加一个const

构造函数对常数据成员进行初始化,只能通过初始化列表

给个例子可以说明3,4,5

#include<iostream>
using namespace std;

class R
{
public:
R(int r1,int r2);
void print();
void print() const;
const int r;
private:
int R1,R2;
const int a;
static const int b;//静态数据成员在类的外面进行定义
};
const int R::b=3;
R::R(int r1,int r2):a(r1),r(r2)//构造函数对常数据成员进行初始化,只能通过初始化列表
{
R1=r1;R2=r2;
};
void R::print()
{
cout<<"NO CONST"<<endl;
cout<<" R1:"<<R1<<" ""R2:"<<R2<<" "<<" r:"<<r<<" "<<"a: "<<a<<" "<<"b: "<<b<<endl;
};
void R::print() const
{
cout<<"CONST!!!"<<endl;
cout<<" R1:"<<R1<<" ""R2:"<<R2<<" "<<" r:"<<r<<" "<<"a: "<<a<<" "<<"b: "<<b<<endl;
};

int main()
{
R k(3,5);
k.print();
const R k2(5,6);//常对象只能调用常成员函数
k2.print();
}

PS:补充一下静态数据成员的作用,突然看到了新的知识点,当然要记下来啊

静态数据成员可以实现同类对象的数据共享,正是因为这种共享性,静态数据成员不属于某一个实体对象,所以也不能由某一个对象来初始化,静态数据成员在类的外面赋值。并且静态的数据成员在内存中只占一份空间。每个对象都可以引用这个静态数据成员。静态数据成员的值对所有对象都是一样的。如果改变它的值,则在各对象中这个数据成员的值都同时改变了。这样可以节约空间,提高效率。(这里是看的别人博客上写的,我觉得说的很清楚)

6.  常指针

const char *p; (读作p is a pointer to const char)

char const *p(同上)

char* const p;(读作 p is a const pointer to char)

0 0