分文件
.h放声明
.cpp放定义, 函数前面要加命名
构造和析构
编译器会默认提供构造函数, 析构函数, 拷贝构造函数(对非静态成员属性简单值拷贝)
编译器会默认调用构造和析构, 如果不写, 系统会默认实现一个空的
必须写在public下
构造函数
与类名相同, 没有返回值, 不写void, 可以发生重载->可以有参数的意思
自动调用, 只调用一次class A{ public: A(){ //构造函数 } };
析构函数
与类名相同, 前面加~, 没有返回值, 不写void, 不能有参数
自动调用, 只调用一次class A{ public: ~A(){ //析构函数 } };
构造函数的分类及调用
拷贝构造函数必须加上const
默认构造函数在创建对象的时候不能加()
分类
按参数
- 无参构造函数
Person p1; person p1();错误
- 有参构造函数
Person p1(1000);或者 Persion p1=Persion(1000); Person(1000); 匿名对象
按类型
- 普通构造函数
- 拷贝构造函数
Person(const Person& p) Person p1(p2); Person p1 = Person(p2);
拷贝构造函数的调用时机
- 用已经创建好的对象来初始化新的对象
- 以值传递的方式给函数参数传值
- 以值得方式返回局部对象
- vs release 会做优化
构造函数的调用规则
- 写了自己的构造函数, 编译器就不会提供默认的构造函数, 但是会提供默认拷贝构造函数
- 写了自己的拷贝构造, 编译器就不会提供其他的构造函数
深拷贝和浅拷贝
有堆区的, 需要自己手动申请空间并复制
初始化列表
Person(int a, int b, intc){
A=a;
B=b;
C=c;
}
Person():A(1), B(2), C(3){}
Person(int a, int b, int c):A(a), B(b), C(c){}
类对象作为类成员
先按顺序构造成员, 再构造自己, 先析构自己, 再逆序析构成员
explicit 关键字
防止隐式类型转换
new delete 运算符
new 类 会返回该类型的指针
并且会调用构造函数
Person* p1=new Person;
相当于
Person* p1=(Person*)malloc(sizeof(Person));
if(p1==NULL){
return 0;
}
p1->Init();调用构造函数