构造函数按两种类型分
1.有无参数
2.普通构造和拷贝构造
#include<iostream>
using namespace std;
/*
构造函数:
1.类型:普通构造、拷贝构造
2.参数:有参和无参
*/
class Person
{
public:
//无参构造函数
Person()
{
cout << "无参构造函数调用" << endl;
}
//有参构造函数
Person(int a)
{
age = a;
cout << "有参构造函数调用" << endl;
}
//拷贝析构函数
//传进一个Person p,完全复制它;const:确保原来的Person对象不被改变
Person(const Person& p)
{
age = p.age;
cout << "拷贝函数调用" << endl;
}
//析构函数
~Person()
{
cout << "析构函数调用" << endl;
}
private:
int age;
};
int main1()
{
//注意:调用无参构造函数不能加括号,如果加了括号,编译器会认为这是一个函数的声明
//Person p1; //无参构造函数
//1.括号法
Person p1(10); //有参构造函数
Person p2(p1); //拷贝构造函数
//2.显示法
cout << endl;
Person p3 = Person(10); //有参构造函数
Person p4 = Person(p1); //拷贝构造函数
//3.隐式转换法
cout << endl;
Person p5 = 10; //有参构造函数 -- 相当于Person p5 = Person(10)
Person p6 = p5; //拷贝构造函数 -- 相当于Person p6 = Person(p5)
return EXIT_SUCCESS;
}
- 构造函数的调用规则
- 系统会默认给一个类添加至少3个函数:默认构造函数、拷贝构造函数、析构函数。
- 如果提供有参构造、系统不会提供默认构造,但是会提供拷贝构造。
- 如果提供拷贝构造,其他构造函数都不提供了。
- 深拷贝与浅拷贝
- 系统提供拷贝构造函数 只会做简单的值拷贝
- 如果类中有属性开辟到堆区,那么在释放时候 ,由于浅拷贝问题导致堆区内容会重复释放,程序down掉
- 利用深拷贝 来解决浅拷贝的问题
- 初始化列表
- 构造函数名称(): 属性值(),属性值().....{}
- 类对象作为类成员
- 先构造其他类对象,再构造本类对象,先析构本类对象,再析构其他类对象
静态成员
在成员变量前 + static
特点:
1.共享一份数据
2.编译阶段分配内存
3.类内声明,类外初始化
访问特点:
1.通过对象
2.通过类名
静态成员函数只能访问静态成员变量
this指针
特点:指向被 调用的成员函数 所属的对象
*this:指所属对象本体
链接编程,通过返回*this返回对象本体,成员函数用 :类名 * 函数名(类名 & 对象名)定义