目录
1.构造函数和析构函数
2. 构造函数的分类及调用
3. 构造函数的调用规则
4. 初始化列表
5. 类对象作为类成员
6. 类的静态成员
7. 放松时刻
1.构造函数和析构函数
构造函数用来初始化一个对象,析构函数用来对一个对象进行清理。
虽然在编写一个类时,这两个函数不是必须的,但是在编译过程中,编译器都会自动的调用这两个函数,如果没有写的话,那么编译器自动生成空函数并调用。
构造函数语法:类名() { ... }
- 构造函数没有返回值,也不需要写void;
- 函数名称要求和类名相同;
- 可以有参数传入,因此函数可以发生成重载。
析构函数语法:~类名() { ... }
- 同上;
- 比构造函数多一个~;
- 不能有参数传入,即不能发生重载。
2. 构造函数的分类及调用
2.1 分类:
- 按参数分为:有参构造和无参构造,即按照有无参数
- 按类型分为:普通构造和拷贝构造
class Person
{
public:
int age;
Person()
{
// 普通构造 & 无参构造
}
Person(int a)
{
// 有参构造
age = a;
}
Person(const Person &p)
{
// 拷贝构造
age = p.age;
}
~Person()
{
// 析构函数
}
};
2.2 调用:
void test()
{
// 括号法
Person p1; // 无参构造
Person p2(10); // 有参构造
Person p3(p2); // 拷贝构造
// 显示法
Person p4 = Person(10); // 有参构造
Person p5 = Person(p4); // 拷贝构造
// 注意事项:不要利用拷贝构造函数初始化匿名函数,如Preson(p3),会发生语法错误
// 隐式转化法
Person p6 = 10; // 有参构造
Person p7 = p6; // 拷贝构造
}
2.3 拷贝构造函数的使用时机
- 使用已经创建好的对象来初始化一个新的对象;?
- 值传递的方式给函数参数传值;
void doSomething(Person p)
{
// ...
}
void test_2()
{
Person p;
doSomething(p);
}
// 此时,doSomething函数中的p就是根据tese_2中的p通过拷贝函数创建的 - 以值的方式返回局部对象。
Person doSome()
{
Person p;
// ...
return p;
}
void test_3()
{
Person p1 = doSome();
// ...
}
3. 构造函数的调用规则
- 若用户没有定义构造函数,编译器会提供默认构造函数,拷贝构造函数和析构函数;
- 如果用户定义了有参构造函数,C++就不会提供默认构造函数,但是会提供拷贝构造函数;
- 如果用户定义了拷贝构造函数,C++就不会提供构造函数。
4. 初始化列表
语法:构造函数():属性1(值1), 属性2(值2), ... { ... }
class Person // 定义一个类
{
int mA;
int mB;
int mC;
// 两种方式,第二种更加灵活
// Person():mA(10), mB(20), mC(30) { /* ... */ }
Person(int a, int b, int c):mA(a), mB(b), mC(c) { /* ... */ }
};
int test()
{
Person p(10, 20, 30); // 初始化操作
}
5. 类对象作为类成员
类构造时,也是使用栈的原理:
可以对构造函数和析构函数进行标记研究,不做展开。
6. 类的静态成员
6.1 静态成员变量
- 所有对象共享同一份数据;
- 在程序的编译阶段就已经分配好内存;
- 类内声明,类外进行初始化;
- 静态成员变量也是有着访问权限的,不过即使类外不可以访问,但是可以初始化;
- 访问静态成员变量时,可以通过对象(p.mA)访问,也可以通过类名进行访问(Person::mA)。
如:在类Person中声明一个static成员属性,在类外初始化为100,第一次打印输出为100,之后通过成员p2改变类的值,打印输出p1时,其值也发生改变。
class Person
{
public:
static int mA;
};
int Person::mA = 100;
void test()
{
Person p1;
cout << p1.mA << endl; // cout << 100
Person p2;
p2.mA = 200;
cout << p1.mA << endl; // cout << 200
}
即,类中声明的静态成员变量,其使用同一块内存空间。
6.2 静态成员函数
- 所有对象共享同一个函数;
- 静态成员函数只能访问静态成员变量;
- 类内定义;
- 静态成员函数是有着访问权限的;
- 调用静态成员函数时,可以通过对象(p.func())访问,也可以通过类名进行访问(Person::func())。
7. 放松时刻
|