C++基础#3:const用法详细介绍
本篇描述了const数据成员在类中的定义及其访问规则。
1. const数据成员的初始化:
(1) 在对象层次上,常量几乎没有任何意义,因此const数据成员通常也是静态的,即用static const来修饰而不是const;
(2) 正如static数据成员一样,satic const数据成员也必须在源文件中为其分配空间并进行初始化,也是最后一次对其赋值的机会。 另外,C++规定,如果数据成员是简单类型(如int,char…..),则允许程序员在声明的同时进行赋值;
(3) 如果真的只用const 而不是static的话,那么,必须在构造函数中以初始化列表的形式对这个const数据成员进行初始化。
例:
#include <stdio.h>
class MaxDefine{
private:
int x;
public:
//const int MaxDefine_10 = 10; //compiler error: ISO C++ forbids initialization of member `MaxDefine_10'
const int MaxDefine_100;
static const int MaxDefine_1000;
static const int MaxDefine_10000 = 10000;
public:
MaxDefine(int value ): MaxDefine_100(value) //必须以这样的初始化列表的形式来进行初始化
{
// MaxDefine_100 = value;//不能这样做,这种写法相当于对常量进行赋值,这不允许,除非是声明的同时进行赋值。
}
};
int const MaxDefine::MaxDefine_1000 = 1000;
void TestMaxDef(void)
{
MaxDefine m100(100);
printf(" m100.MaxDefine_100 = %d /n", m100.MaxDefine_100); // OK: m100.MaxDefine_100 = 100
printf(" m100.MaxDefine_100 = %d /n", MaxDefine.MaxDefine_100); //expected primary-expression before '.' token. 因为MaxDefine_100属于对象而不属于类。
printf(" MaxDefine::MaxDefine_1000 = %d /n", MaxDefine::MaxDefine_1000); // OK: MaxDefine::MaxDefine_1000 = 1000
printf(" MaxDefine::MaxDefine_10000 = %d /n", MaxDefine::MaxDefine_10000);//OK: MaxDefine::MaxDefine_10000 = 10000
}
int main(void)
{
TestMaxDef();
while(1);
return 0;
}
//result:
/* MaxDefine::MaxDefine_1000 = 1000;
MaxDefine::MaxDefine_10000 = 10000;
*/
代码说明:
(1) compiler error: ISO C++ forbids initialization of member `MaxDefine_10’:
不能对数据成员在初始化时进行赋值操作,即使赋值0也不可以。
2. const数据成员与const成员函数:
(1)不能将静态方法声明为const,因为这是多余的。静态方法根本没有相应的类实例,因此它们不可能修改内部值。
(2)非const对象可以调用const和非const方法,但是,const对象只能调用const方法。
例:
#include <stdio.h>
class Widget {
private:
int h; //height
int w; //width
static const int hMax = 320;
static const int wMax = 240;
public:
Widget(int height, int width):
h(height < hMax ? height: hMax),
w(width < wMax ? width: wMax)
{
//nothing
}
int get_height() const;
int get_width() const;
void printSize()
{
printf(" printSize: height = %d /n", h);
printf(" printSize: height = %d /n", w);
}
};
int Widget::get_height() const { return h; }
int Widget::get_width() const { return w; }
int main(void)
{
Widget window(128, 240);
const Widget window2(116,116);
printf(" window.get_height() = %d /n", window.get_height());
printf(" window.get_width() = %d /n", window.get_width());
window.printSize();
printf("/n");
printf(" window2.get_height() = %d /n", window2.get_height());
printf(" window2.get_width() = %d /n/n", window2.get_width());
//window2.printSize(); //compile error:passing `const Widget' as `this' argument of `void Widget::printSize()' discards qualifiers
while(1);
return 0;
}
//result:
/*
window.get_height() = 128
window.get_width() = 240
printSize: height = 128
printSize: height = 240
window2.get_height() = 116
window2.get_width() = 116
*/
代码说明:
compile error:passing `const Widget’ as `this’ argument of `void Widget::printSize()’ discards qualifiers:
编译错误,因为widget2是const数据成员,那么,它只能访问const成员函数,而不能访问非const成员函数。
- 有用链接:
以上描述了const数据成员在类中的定义及其访问规则,而其它更加详细的用法,请参考以下文章:
http://blog.chinaunix.net/u3/96369/showart_2054536.html
http://www.yuanma.org/data/2007/0429/article_2549.htm
还没有评论,来说两句吧...