C++ 复习二
1.构造函数
1.1 拷贝构造函数
Student(const Student &p){}
函数值传递和值返回会调用拷贝构造函数
1.2 不能用括号法调用无参构造函数(Student p()//编译器会认为是一个函数的声明)
1.3 匿名调用对象(Student(10)//当前执行完后系统自动回收)
不可以用拷贝构造函数来初始化匿名对象,编译器会认为是对象声明 Student(s1)//Student s1;
1.4 隐式调用(Student s1=10 //等价于Student s1=Student(10);)
1.5 系统默认有构造函数(自己提供有参构造,则默认没有构造函数),拷贝构造函数(自己提供拷贝,则不提供其他),析构函数
1.6 深浅拷贝
默认浅拷贝(系统只会进行简单值拷贝,如果类中属性开辟堆区,释放时会造成重复释放程序down)
深拷贝(先开辟自己的堆空间)
2.初始化列表(构造函数(int a):属性(a))
3.当其他类对象作为本类成员时,先构造其他类对象,在构造自身,析构顺序相反
4.explicit关键字:防止隐式类型转换的方式初始化对象(Student str = 10//歧义int或string)
5.malloc和new的区别
5.1 new是一个运算符,malloc是库函数
5.2 malloc返回值是 void* new返回值是new出来的对象的指针
5.3 malloc需要判断是否开辟成功 而new内部做好了操作(内部malloc数据在堆区,并判断内存是否分配成功,调用构造函数)
5.4 malloc不会调用构造函数,而new调用构造函数
5.5 malloc对应的释放是free,而new对应的释放是delete
5.6 注意
在堆区new创造数组时必须有默认构造对象 Student *s = new Student[10];(数组释放delete []s;)
在栈上开辟Student s[10] = {…}可以使用有参构造
6.静态成员变量
6.1 数据共享,在编译时已经分配了内存,在类内声明,类外初始化
6.2 访问方式
通过对象访问(s.name)通过类名访问(Student::name)静态成员变量也有访问权限
7. 静态成员函数
静态成员函数是不能访问非静态成员变量(因为静态成员函数是共享的,无法区分变量归属于谁)
静态成员函数也具有访问权限(私有权限类外访问不到)
8.单例模式(一个类只有一个实例化对象)
8.1 私有化(默认构造函数,拷贝构造函数,唯一的对象指针,变成只读状态)
8.2 对外提供公共接口
8.3 打印机单例模式
class Printer
{
public:
static Printer *getInstance()
{
return printer;
}
void printText(string text)
{
cout<<“打印”<<endl;
}
private:
Printer()
{}
Printer(const Printer &p)
{}
static Printer * printer;
}
//测试
Printer *p = Printer::getInstance();
p->printText("…");