设计不能被拷贝的类
C++98的解决方法
将类成员函数设计成私有(防止重载)
只有声明没有定义(操作了也什么也不做)
C++11 解决方法
C++ 拓展delete 的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上 = delete;表示让编译器删除默认成员函数
设计一个类只能在堆上创建对象
实现方法:
将该类的构造函数设置为私有 ,构造声明为私有。防止被人调用拷贝在栈上生存对象。
提供一个 静态的成员函数,在该静态的成员函数中完成堆对象的创建
设计一个类只能在栈上创建对象同上 设计 静态方法对象 创建对象返回即可
设计一个类 不可以被继承
C++98
将构造函数私有化派生类中找不到积基类的构造函数 则无法被继承
C++11 使用final 关键字
class A final
{
}
设计一个类只能创建一个对象(单例模式)
设计模式
一个类只能创建一个对象,即单例模式.该模式可以保证系统中该类只有一个实例,并提供一个 访问它的全局访问点,该实例被所有程序模块共享
饿汉模式(Eager Initialization):
在这种方式中,单例对象在类被加载时就创建了,通常是在类初始化阶段。这意味着不管这个对象是否被使用,它都会被创建,因此被称为“饿汉”。
优点是实现简单,线程安全,因为实例是在类加载时创建的,不存在多线程同时创建实例的问题。
缺点是不管是否需要这个实例,它都会被创建,可能会占用资源。
懒汉模式(Lazy Initialization):
在这种方式中,单例对象在第一次被需要时才创建。这种方式称为“懒汉”,因为它“懒”得在程序启动时就创建对象,而是等到真正需要时才创建。
优点是只有在需要时才创建对象,节省资源,特别是当对象的创建成本较高时。
缺点是如果不正确地处理线程安全问题,可能会导致多个线程同时创建多个实例。为了解决这个问题,通常需要使用同步机制,如
synchronized
关键字或者ReentrantLock
。
C++中的类型转换
在C语言中 如果赋值运算符左右类型不同,或者形参与实参;类型不匹配,或者返回值类型与接收值类型不一样的时候,就需要发生类型转化
隐式转换
编译器自己转换 失败就编译失败
显示转换
使用强制转换符(int) 进行强制转换
C++完全兼容C语言,但是C++更加复杂提供了更为标准的类型转换
C++中的4中类型转化分别为
static_cast 静态类型转换
将float转换成int 向上转换
派生类指针转换成基类指针
用于将多态类型转换成非多态类型
double d = 12.34;
int a = static_cast(d);
reinterprt_cast 重新解释型类型转换
为操作数的位模式提供较低层次的重新解释
底层指针之间的转换 ,用于将一种类型转换 为另一种不同的类型
const_cast 常量类型转换
使用
const_cast
来去除const
属性dynamic_cast 动态类型转换
类类型层次的向下转换,从基类指针或转为派生类指针或引用,转换在运行时检查确保转换的安全 转换失败返回nullptr
dynamic_cast只能用于父类含有虚函数的类