#include <iostream>
//构造函数私有
class A
{
private:
static int dog; //#1# 静态数据成员
A(){ std::cout << "A类构造函数\n"; }
public:
static A* fun(){ return new A; } //static指出这是静态成员函数
//该静态成员函数因为属于类的成员函数所以可以访问私有部分,创建一个 对象 返回其地址
};
A* S = A::fun(); //调用静态成员函数方法是 类名::函数名()
//注意:
//1、静态成员函数不与对象关联,因此只能使用静态数据成员,非静态成员函数也可使用静态数据成员
//2、静态函数无this指针,因此对象无法调用(成员函数是用this指针访问调用对象的数据的,隐式传递)
//3、若静态成员函数在外部定义,不能使用关键字 static 只在声明时使用(或在类内声明)
//静态数据成员(参加 “#1#”)即使私有,也可使用 如 A::dog访问和初始化、赋值
//原因:静态数据成员 并未和类 的其他非静态数据成员放在一起,而是放在别处,和全局变量一样
//而且即使创建多个类对象,只有一个静态数据成员,无副本
//通常类所有的对象共享一组成员函数,也就说创建对象时,只需分配储存非静态的数据成员空间
// 其他只有一个,无副本,(静态数据成员,静态成员函数,枚举常量)
/*私有构造函数用途:
常用与限定类的对象数量,例如 ostream类【对象有 cout ceer。。。】不能自定义对象
你可以试试,编译器会报错,大概就是没有公有的构造函数或者构造函数私有无法访问
限定方法:用一个静态数据成员限定 对象数量
静态成员函数构建对象前,检测这个变量是否为0,不为0才创建
下面有个例子*/
class B
{
static int dog; //默认访问权限 private
B(){ std::cout << "构造B、\n"; }
public:
static B* fun();
};
int B::dog = 5; //初始化 限定只能有 5个B的对象
B* B::fun()
{
if (dog > 0) //检测是否已到限定数量
return new B;
std::cout << "超出数量限制\n";
return nullptr; //C++11空指针
}
感谢大神的讲解