// Contest_Test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using namespace std; class CTest { int m_nCount; int m_nIndex; static int m_nSta; public: static const int m_nStatic; //const static int m_nNum = 0; 在DEV-C++当中可以运行通过,这里报错 public: CTest()//:m_nStatic(0) 不能在这里初始化 { m_nIndex = 0; m_nCount = 0; //m_nStatic = 0; ERROR } CTest(int i, int j) { m_nIndex = j; m_nCount = i; } int GetCount()const { //m_nCount = 0;只读成员函数不能修改本类内的非静态成员变量 m_nSta = 88; return m_nCount; } int GetCount() { return m_nCount; } int GetIndex() { return m_nIndex; //这里可有修改非静态成员变量 } void GetSta() const { cout<<m_nSta<<endl; //普通成员函数可以访问静态成员变量 } int GetStatic() const { return m_nStatic; } }; int CTest::m_nSta = 9; const int CTest::m_nStatic = 8; int main(int argc, char* argv[]) { CTest t; CTest t1(2,3); t.GetCount(); //当既有const成员函数又有普通成员函数,类对象是普通对象,优先调用普通成员函数 t1.GetCount(); t.GetIndex(); t1.GetIndex(); // cout<<t1.GetSta()<<endl; const CTest t2; t2.GetCount();//t2为const对象,那么只能调用const成员函数 t2.GetSta(); //t2.GetIndex();//const对象不能调用普通成员函数 cout<<&CTest::m_nStatic<<endl; cout<<&t.m_nStatic<<endl; cout<<&t1.m_nStatic<<endl; cout<<&t2.m_nStatic<<endl; cout<<"CTest类对象的大小:"<<sizeof(CTest)<<endl; //输出为8 说明static const int 变量也不是属于类 return 0; }
1、只读成员函数:未经const限制的成员函数是普通成员函数。
a)只读成员函数是const置于成员函数右括号之后修饰的成员函数;
b)const成员函数不修改成员变量的数据。
即:成员函数中出现的成员变量仅可以作为右值,不可以做左值;
c) 没有只读的构造函数和析构函数:因为构造函数和析构函数本身就是要对成员操作的;
d)要对成员数据进行设置(Set...类)的函数,不能使用const只读函数;
e)返回值是引用类型的时候,返回的变量是本类的成员时,也不能使用const只读函数;
f)当两个版本并存时,对象优先调用普通的成员函数,
只读的成员函数仅仅用于只读对象(或只读的对象引用)仅仅调用;
e)对象调用只读成员函数时,关键字const本质上约束this形参为只读属性.
注意标红的那句,一般不会注意到这个;