1.构造函数
-
特征:
- 函数名与类名相同
- 函数没有返回值
- 函数不需要用户调用,在创建对象的时候自动调用
-
作用:用于在定义对象的时候,初始化对象中的数据成员 -
语法: class 类名
{
public:
类名()
{
}
}
例子:
class base
{
public:
base()
{
cout << "调用构造函数" << endl;
}
}
-
注意:
- 构造函数必须要写在公共区,因为在创建对象的时候会自动调用该函数,假设不是公共区的函数,则无法调用,导致对象的创建失败 。
- 假设用户没有写任何的构造函数,则系统会自动生成一个无参构造函数。
-
提示: 1. 构造函数也支持函数重载 2. 构造函数也支持默认参数
2.析构函数
- 特征:
- 函数名与类名相同在函数名前面添加 ~
- 析构函数没有返回值,没有参数
- 当对象销毁的时候系统自动调用(析构函数可以释放成员空间)
- 作用: 用于释放构造函数中初始化的数据成员。
- 注意:
- 析构函数是不可以重载的,因为重载的依据是参数!
- 析构函数也需要编写到公共区中,因为对象销毁时自动调用。
- 原理
3.构造函数的参数列表初始化
-
作用: 在构造函数中一种特殊的初始化方式,用于初始化类中的数据成员。 -
提示:这种初始化方式并不是万能的,如果数据类型不支持 =号赋值就不能用该方法,例如:数组
4. 拷贝构造函数 (重点,难点)
-
系统自动生成的浅拷贝方法: #include <iostream>
using namespace std;
class base
{
public:
base(int a,int b):a(a),b(b){}
void show()
{
cout << a << endl;
cout << b << endl;
}
private:
int a;
int b;
};
int main()
{
base a(10,20);
a.show();
base b=a;
b.show();
}
-
浅拷贝 -》 直接赋值 -
重写系统的拷贝构造函数 当在构造函数中传递的参数是类的引用时,那么这个构造函数就是重写后的拷贝构造函数 语法: class 类名
{
public:
类名(类名 &a)
{
}
}
提示:当用户重写拷贝构造函数后,系统就不会自动生成一个浅拷贝构造方法
--------------------------------------------------------------
例子:
class base
{
public:
base(base &a)
{
cout << "重写后的拷贝构造函数" << endl;
}
}
-
深拷贝
-
为什么需要深拷贝? -
重写拷贝构造函数,实现深拷贝 class base
{
public:
base(const char *str)
{
p = new char[1024];
strcpy(p,str);
}
base(base &a)
{
cout << "调用重写后的拷贝构造函数,实现深拷贝" << endl;
p= new char[1024];
strcpy(p,a.p);
}
void show()
{
cout << "堆空间的地址" << (void *)p << "内容" << p << endl;
}
char *p;
};
5. 类外定义类中的成员函数
语法:
函数的返回值 类名::函数的名称(参数列表)
{
}
-------------------------------------------
例子:
class base
{
public:
void show();
};
void base::show()
{
cout << "show base" << endl;
}
|