// 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形参为只读属性.
注意标红的那句,一般不会注意到这个;