码迷,mamicode.com
首页 > 其他好文 > 详细

const

时间:2015-07-23 13:58:03      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

const变量
const变量有三种出现的位置
关键的一点是:const关键字的目的是说明变量不能被修改或更新,所以定义时必须初始化
1、全局const变量
进程内存那篇文章我们说过,全局的只读变量(const)被放在代码段,也可以说是只读数据段

const int i =0; 

const全局变量是一定要初始化的,否则会编译错误。初始化后,编译器在类型检查后直接用0在编译时替换。
const全局变量的作用域是当前文件,如果要在程序中的其他文件使用,一定要加上extern关键字,调用它的文件中也要是使用extern关键字

//file1.cc
extern const int i=0;
//file2.cc
extern const int i;//使用i

2、函数中的const变量
同样,定义时就要初始化,只不过作用域是当前函数。

3、类的const成员
不能在类内初始化,只能通过构造函数初始化列表初始化。

const指针

指向常量指针(point to const) 是说明指针的内容是常量,不能通过指针修改其所指对象的值。

const double pi = 3.14;  //ptr是常量,它的值不能改变
double *ptr = &ptr;  //error,ptr是一个普通指针
const double *cptr = π //cptr可以指向一个double的常量
*cptr =1.0;  //error,不能修改*cptr的值

和常量引用一样,指向常量的指针也没有规定其所指的对象必须是个常量。
double dval = 3.14; //dval普通变量,它的值可以改变
cptr = &dval; //正确,但是不能通过cptr改变dval的值。

const指针 指针是对象而引用不是,因此允许将指针像其他对象一样定义为常量。
常量指针必须初始化,一旦初始化,它的值(就是存在指针里的地址,也就是指针本身的值)将不能改变。这说明不变的是指针本身而不是所指向的那个对象。

int errNumb =0;
int *const currErr = &errNumb;   //currErr将一直指向errNumb
const double pi = 3.14;
const double *const pip = π //pip是一个指向常量对象的常量指针。

const引用

对常量的引用reference to const,同指向常量的指针一样,不能被用作修改他所绑定的对象。

const int ci = 1024;
const int &r1 = ci;   //正确,引用及其对应的对象都是常量
r1 = 42;  //错误,r1是对常量的引用

const成员函数
对象中的this指针默认情况下的类型是,指向对象的非常量版本的常量指针。这样,我们就不能将this绑定到一个常量对象上去(参见上面的解释)。也就是说,我们不能再常量对象上调用普通的成员函数。所以,任何不会修改数据成员的函数都应该声明为const成员函数,这样在类型上没有问题,而且任何尝试修改数据成员的都将报错。

注意const是加在函数后面的修饰符

std::string isbn() const {return this->bookNo;}

const成员函数的一个重要作用就是const重载。常见的做法就是根据对象是否为const调用不同的版本。

class screen{
public:
    Screen &disp(ostream &os)
                {do_disp(os); return *this;}  //this为指向非const对象的常量指针
    const Screen &disp(ostream &os) const
                {do_disp(os); return *this;}  //this指向const对象的常量指针
private:
    void do_disp(ostream &os) const {os<<contents;}

};

Screen myScreen(5,3);
const Screen blank(5,3);
myScreen.set(‘#‘).disp(cout);   //非常版本
blank.disp(cout);  //常量版本

字符数组

如char * name = “china”; 这样的语句,在编译时是能够通过的,但是”china”是常量字符数组,任何想修改他的操作也能通过编译但会引起运行时错误,如果我们想修改字符数组的话就要使用char name[ ] = “china”; 这种形式。

C++规定,只有“const static的整形成员”才可以在类定义体中进行初始化。

const和static的区别

1、const的局部变量在超出其作用域后其空间会被释放,static放在静态存储区
2、类的static成员不能在类内初始化,只能在内部声明,在外部定义。并且定义时不能表示static.
const不能再类定义处初始化,只能通过构造函数初始化列表初始化,并且必须有构造函数。
3、static数据成员不属于对象,只属于类,所有的对象访问的都是同一个static成员。
const数据成员,只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。
4、const成员函数的目的是防止成员函数修改对象的内容(成员数据),即可以访问成员数据但是不能修改成员数据。
static成员函数作为类作用域的全局函数。不能访问类的非静态成员(数据和函数)(因为没有this),不能被声明为virtual

成员函数不能同时为virtual和static

成员函数不可同时为virtual和static。 
多态实现的基本原理是每个带有virtual函数的类的【实例】要包含一个指针,指向虚函数表(vtbl)。
static函数做为类函数,不与任何【实例】相关,自然无法实现多态了。

更多关于虚函数的内容参见虚函数那篇。

版权声明:本文为博主原创文章,未经博主允许不得转载。

const

标签:

原文地址:http://blog.csdn.net/whzyb1991/article/details/47020519

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!