C++ 特殊成员
C++常成员
-
常对象:const修饰的对象叫常对象
- 只能调用常成员函数
- 只能调用常成员函数
-
常数据成员:const修饰的数据,一般写在函数尾部
- 不能被修改
- 初始化必须使用初始化参数列表进行初始化
-
常成员函数:用const修饰的函数
- 在当前函数中不能修改数据成员
- 可以与普通函数有重载,普通函数优先调用普通成员,常对象只能调用常成员函数,但是普通对象也可以调用常成员函数
C++静态成员
-
static对象:static修饰的对象,它是在程序最后被释放的
-
static数据
- 必须要在类外初始化
- 静态数据的访问可以不必须要对象,但要类限定名
- 静态数据依旧受权限限定
- 静态数据是所有对象公有的,任何对象都可以访问静态数据
-
static成员函数:static修饰的函数,一般写在函数前面
- 静态成员函数访问非静态时候必须指定对象
- 不能直接访问非静态数据成员
- 不能用this指针
- 静态成员函数的访问可以不必须要对象,但要类限定名
拓展:单例设计模式
- 单列设计模式分为:懒汉式与饿汉式
- 步骤:
- 构造函数私有化
- 提供一个全局的静态方法
- 类中定义一个静态指针,指向唯一对象
- 懒汉式:无创建单例对象,没有在外面创建对象
#include <iostream>
//懒汉式
class SingleTon
{
private:
SingleTon();//构造函数私有化
public:
static SingleTon* pObject;
static SingleTon* getInstance();
void print()
{
std::cout << "测试" << std::endl;
}
};
SingleTon* SingleTon::pObject = NULL;
SingleTon::SingleTon()
{
std::cout << "资源加载" << std::endl;
}
SingleTon* SingleTon::getInstance()
{
//保证外部只有唯一的对象方式
if (pObject == NULL)
{
pObject = new SingleTon;
}
return pObject;
}
int main()
{
SingleTon* p1 = SingleTon::getInstance();
SingleTon* p2 = SingleTon::getInstance();
std::cout << p1 << std::endl;
std::cout << p2 << std::endl;
p1->print();
p2->print();
return 0;
}
- 饿汉式:直接在外面创建对象了
#include <iostream>
//饿汉式
class SingleTon
{
private:
SingleTon();//构造函数私有化
public:
static SingleTon* pObject;
static SingleTon* getInstance();
void print()
{
std::cout << "测试" << std::endl;
}
};
//唯一对象
SingleTon* SingleTon::pObject = new SingleTon;
SingleTon::SingleTon()
{
std::cout << "资源加载" << std::endl;
}
SingleTon* SingleTon::getInstance()
{
return pObject;
}
int main()
{
SingleTon* p1 = SingleTon::getInstance();
SingleTon* p2 = SingleTon::getInstance();
std::cout << p1 << std::endl;
std::cout << p2 << std::endl;
p1->print();
p2->print();
return 0;
}
- 运行结果都一样
C++友元
-
友元函数:friend修饰的函数
-
普通函数成为友元函数
-
以另一个类的成员函数成为友元函数
-
-
友元类:friend修饰的类
无论是友元函数还是有友元类只是提供对象在特定场所具有无视权限的功能
-
友元不具有传递性