普通的成员方法:
1.属于类的作用域
2.调用该方法时需要依赖一个对象(常对象无法调用)
3.可以任意访问对象的私有成员
静态成员方法:(不会生成this形参)
1.属于类的作用域
2.用类名作用域调用方法
3.可以任意访问对象的私有成员,但是仅限于不依赖对象的成员(只能调用其他的静态成员)
class CShop{
public:
CShop(const char *n, int a, double p,int y, int m, int d)
:_amount(a)//int _amount = a;
,_price(p)
{
strcpy(_name, n);
_count++;
}
void ShowCShopCount(){
cout<<count<<endl;
}
static void StaticShowCShopCount(){//静态成员方法
cout<<count<<endl;
}
private:
char _name[20];
int _amount;
double _price;
static int _count;//记录该类定义了多少个对象,声明一个静态变量
//保存在数据段bss段上,不属于对象,属于类级别
};
int CShop::_count = 0;//static成员变量一定要在类外进行定义并且初始化
int main(){
CShop goods1("A",50,500.0);
CShop goods2("B",50,500.0);
CShop goods3("C",50,500.0);
CShop goods4("D",50,500.0);
goods4.ShowCShopCount();//作用上能达到要求,但是用goods4调用打印全部的个数有些不符合逻辑,但是又不能直接用类名调用,因为是一个【普通的成员方法】
CShop::StaticShowCShopCount();//静态成员方法直接用类名调用
return 0;
}
static静态成员方法和普通的成员方法的区别:
1.最基本:前者用类名调用,后者用对象调用
2.重点:前者调用时不依赖于对象,所以定义时不会生成this指针,所以静态成员方法无法访问普通的成员变量
const常成员方法
1.属于类的作用域
2.调用该方法时需要依赖一个对象,常对象和普通对象都可以调用
class CDate{
public:
CDate(int y, int m, int d){
_year = y;
_month = m;
_day = d;
}
void show(){
cout << _year << "/" << _month << "/" << _day << endl;
}
void show()const{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
class CShop{
public:
CShop(const char *n, int a, double p,int y, int m, int d)
:_date(y, m, d)
,_amount(a)
,_price(p)
{
strcpy(_name, n);
}
void show(){
cout<<"name:"<<_name<<endl;
cout<<"amount:"<<_amount<<endl;
cout<<"price:"<<_price<<endl;
_date.show();
}
//常成员方法,构成重载
void show()const{//如此定义后,const CShop *this,对象是常量,对象的成员变量都是常量
cout<<"name:"<<_name<<endl;
cout<<"amount:"<<_amount<<endl;
cout<<"price:"<<_price<<endl;
_date.show();//如此一来,CDate类的成员方法show()也需要再写一个const重载
}
private:
char _name[20];
int _amount;
double _price;
CDate _date;
};
int main(){
const CShop goods5("E",1,50000.0);//定义一个常量对象
goods5.show();//如果不写const重载会报错,因为把该常量对象的地址传到了show中的普通形参指针this
return 0;
}
在成员方法对成员变量执行只读不写的操作时,建议一律写成const常成员方法,普通对象和常量对象都可以调用