知识点3 静态成员 static修饰的成员
为什么要使用static修饰静态成员函数
#include <iostream>
using namespace std;
class Data
{
private:
int num;//普通成员变量
static int data;//静态成员变量(类内声明)
public:
//普通的成员函数依赖于对象,必须调用
int getData(void)
{
return data;
}
//静态成员函数属于类而不属于对象
static int setStaticData(void)
{
return data;
}
};
//类外定义时不需要加static
int Data::data = 100;//类外定义+初始化
int main()
{
//cout << Data::data << endl;//报错,静态data是私有的,类外不能够直接访问
//cout << Data::getData() << endl;//报错,getData必须通过成员对象调用
Data ob;
cout << ob.getData() << endl;
//出现的问题:data是静态的,在创建对象之前就已经存在了
//如果没有实例化对象,难道就无法使用data了吗
//为了解决以上问题,需要使用到静态成员函数
//1.静态成员函数属于类,可以直接通过类名称访问
cout << Data::setStaticData() << endl;
//2.也可以通过对象名称访问 对象共享静态成员函数
cout << ob.setStaticData() << endl;
}
注意事项
1、静态成员函数的目的在于操作静态成员数据
2、静态成员函数不能够直接访问非静态成员数据(静态成员函数内部没有this指针)
3、普通成员函数可以操作静态成员数据和非静态成员数据
4、静态成员变量和静态成员函数都有权限之分
使用const修饰的静态成员
如果一个类的成员既要实现共享,又要实现不可被改变,就要使用static const修饰
#include <iostream>
using namespace std;
class Data
{
public:
const static int data;
static int getDataStatic(void)
{
return data;
}
};
const int Data::data = 100;
int main()
{
//可以访问
cout << Data::data << endl;
//Data::data = 200;//data静态成员只读
cout << Data::data << endl;
}
知识点4 静态成员的使用案例
使用静态成员统计类实例化的对象的个数
#include <iostream>
using namespace std;
class Data
{
public:
static int count;
Data()
{
cout << "无参构造" << endl;
count++;
}
Data (const Data &ob)
{
cout << "拷贝构造函数" << endl;
count ++;
}
~Data()
{
count --;
cout << "析构函数" << endl;
}
};
int Data::count = 0;
int main()
{
Data ob1;
Data ob2;
Data ob3;
{
Data ob4;
Data ob5;
cout << "对象的个数:" << Data::count << endl; //5
}
cout << "对象的个数:" << Data::count << endl; //3
return 0;
}
设计单例模式 只能实例化一个对象,还要借助公共的方法拿到这个地址
第一步:在单例类内部定义一个Singleton类型的静态对象,作为外部共享的唯一实例
第二步:提供一个公共静态的方法,让客户可以访问它的唯一实例
第三步:为了防止在外部对实例化其他对象,将其默认构造函数和拷贝构造函数设计为私有
知识点5 this指针(重点)
C++的封装性将数据和方法封装在一起,但是数据和方法是分开存储的,每一个对象都拥有独立的数据,但是共享同一个方法。
当一个对象去调用成员函数的时候,系统会自动把对象的地址赋值给this指针,this指针指向外部调用成员方法的对象。
隐式转换
m_num = num;//编写的代码
this -> m_num = num;//实际运行时的代码
具体实例
#include <iostream>
using namespace std;
class Data
{
public:
int m_num;
void setNum(int num)
{
this -> m_num = num;
}
};
int main()
{
Data ob1;
ob1.setNum(10);
cout << "ob1.m_num = " << ob1.m_num << endl;
Data ob2;
ob2.setNum(20);
cout << "ob2.m_num = " << ob2.m_num << endl;
Data ob3;
ob3.setNum(30);
cout << "ob3.m_num = " << ob3.m_num << endl;
}
注意事项
1、this指针是隐含在对象成员函数内的一种指针
2、成员函数通过this指针可以知道操作的说哪个对象的数据
3、静态成员函数内部没有this指针,静态成员函数属于类的内部。静态成员函数不能操作非静态成员变量。
知识点6 this指针的使用
当形参和成员变量同名时,可用this指针来区分
class Data
{
public:
int num;
//形参和成员名相同
void setNum(int num)
{
//num = num;//由于就近原则,形参num赋值给形参num
//将形参num赋值给对象成员num
this -> num = num;
}
};
在类的普通成员函数中返回对象本身(*this)(重要)
#include <iostream>
#include <string>
using namespace std;
class MyCout
{
public:
MyCout& myCout(char *str)
{
cout << str;
return *this;//*this代表的就是当前该函数调用的对象
}
};
int main()
{
MyCout ob;
//原来的输出方式
/*ob.myCout("Mo");
ob.myCout("Mo");
ob.myCout("Ka");*/
ob.myCout("Mo").myCout("Mo").myCout("Ka");
return 0;
}