const成员变量与const成员函数
之前我们分析过常量指针和指针常量,主要看const在*的左边还是右边,这里就不再赘述了。
一般在设计类时,如果不想改变成员函数中的非静态数据成员则在函数后面加const,反之则不加const,因此const关键字更加明确了成员函数的行为(可读可写),使用const修饰的成员函数可读不可写,没有使用const的则可读可写。
注意:
1、常量(const修饰)对象可以调用常量(const修饰)成员函数,不能调用非常量(非const修饰)函数
2、两个成员函数如果只是常量性不同,可以被重载。
class Test
{
public:
void Fun()
{
cout << "Fun" << endl;
}
void Fun(const char *c)const
{
cout << "const Fun" << c << endl;
}
};
void main()
{
//普通对象
Test t;
t.Fun();
t.Fun("普通函数");
//引用
Test &t1 = t;
t1.Fun();
t1.Fun("引用");
Test *t2 = &t;
t2->Fun();
t2->Fun("指针");
const Test *pt1 = t2;
//pt1->Fun();
pt1->Fun("常量指针 值不变 地址可变");
Test const *pt2 = t2;
pt1->Fun("常量指针 值不变 地址可变");
Test *const pt3 = t2;
pt3->Fun("指针常量 地址不变 值可变");
system("pause");
}
请问const修饰的是谁
因为c++对类的this指针做了隐藏,本质上,const指针修饰的是被隐藏的this指针所指向的内存空间,修饰的是this指针。
void Fun(ing a,int b)const <==> void Fun(const ClassName *const this,int a,int b)
const成员函数中修改指针数据成员
当成员函数声明为const时,是不被允许修改类的数据成员的。当类的数据成员为指针类型时即使是const函数只能保证不修改指针的值,不能保证修改指针指向的对象。
class Test
{
public:
void Fun( char *c)const
{
//this->m_c = c;//必须是可修改的左值
*m_c = *c;
}
public:
char *m_c;
};
总结
1、const成员函数可以访问非const对象的非const数据成员和const数据成员,可以访问const对象中的所有数据成员
2、非const成员函数可以访问非const对象的非const数据成员,const数据成员,但不可访问const对象中的数据成员
3、在声明一个函数时如果不对数据成员作修改操作,建议声明为一个const成员函数
4、只有const成员函数时,非const对象可以调用const成员函数。如果const成员函数和非const成员函数同时存在时,非const对象两者都可调用,而const对象只会调用const成员函数。
脑子有点晕,记得多看几遍。
应尽可能地使用const成员函数,很多人对使用const成员函数的目的不了解,其实它只是一种方法,让函数对调用者承诺“不会修改对象”,而编译器确保这个承诺。这是一个保证代码没有副作用的好方法。不会在任何你不知道的情况下改变对象。