一、类和对象
1、封装
详见第八天学习内容
2、对象的初始化和清理
C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置
(1)构造函数和析构函数
对象的初始化和清理也是两个非常重要的安全问题
- 一个对象或者变量没有初始状态,对其使用后果是未知的
- 同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题
构造函数:主要用于在创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用
析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作
构造和析构都是必须有的,如果自己不写,编译器会自动添加,但是系统提供的是空实现
构造函数语法:类名 () { }
- 构造函数,没有返回值也不写void
- 函数名称与类名相同
- 构造函数可以有参数,因此可以发生重载
- 程序在调用对象时会自动调用构造,无须手动调用,而且只会调用一次
析构函数语法:~类名() { }
- 析构函数,没有返回值也不写void
- 函数名称与类名相同,在名称前加上符号 ~
- 析构函数不可以有参数,因此不可以发生重载
- 程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
对比示例
#include<iostream>
using namespace std;
//创建类
class person
{
public:
//1、构造函数
person()
{
cout << "person构造函数的调用" << endl;
}
//2、析构函数
~person()
{
cout << "person析构函数的调用" << endl;
}
};
void test01()
{
person p;
}
int main()
{
test01();
system("pause");
return 0;
}
#include<iostream>
using namespace std;
//创建类
class person
{
public:
//1、构造函数
person()
{
cout << "person构造函数的调用" << endl;
}
//2、析构函数
~person()
{
cout << "person析构函数的调用" << endl;
}
};
void test01()
{
person p;
}
int main()
{
//test01();
person p;
system("pause");
return 0;
}
(2)构造函数的分类及调用
两种分类方式:
- 按参数分类:有参构造和无参构造
- 按类型分类:普通构造和拷贝构造
三种调用方式:
- 括号法
- 显示法
- 隐式转换法
注意事项
== 1、调用默认构造函数时,不要加(),编译器会认为这是一个函数声明==
== 2、不要利用拷贝构造函数,初始化匿名对象==
示例代码
#include<iostream>
using namespace std;
//创建类
class person
{
public:
//1、构造函数
person()
{
cout << "person无参构造函数的调用" << endl;
}
person(int a)
{
age = a;
cout << "person有参构造函数的调用" << endl;
}
//拷贝构造函数
person(const person &p) //拷贝构造函数写法
{
//将传入的人身上的所有属性,拷贝到此函数内人的身上
age = p.age;
cout << "person拷贝构造函数的调用" << endl;
}
//2、析构函数
~person()
{
cout << "person析构函数的调用" << endl;
}
int age;
};
//调用
void test01()
{
//1、括号法
cout << "1、括号法" << endl;
person p1;//默认构造函数的调用
person p2(10);//有参构造函数
person p3(p2);//拷贝函数
cout << "\n";
//2、显示法
cout << "2、显示法" << endl;
person p4;
person p5 = person(10);
person p6 = person(p2);
cout << "\n";
cout << "匿名对象,执行结束后立即释放" << endl;
person(10);//匿名对象 当前行执行结束后,系统会立即回收掉匿名对象
cout << "123456" << endl;
cout << "\n";
//3、隐式转换法
cout << "3、隐式转换法" << endl;
person p7 = 10;//相当于写了person p6=person(10);//有参构造
person p8 = p4;//拷贝构造
}
int main()
{
test01();
system("pause");
return 0;
}
(3)拷贝构造函数调用时机
- 使用一个已经创建完毕的对象来初始化一个新对象
- 值传递的方式给函数参数传值
- 以值方式返回局部对象
(4)构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数
- 默认构造函数(无参,函数体为空)
- 默认析构函数(无参,函数体为空)
- 默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则:
- 如果用户定义有参构造函数,C++不在提供默认无参构造,但是会提供默认拷贝构造
- 如果用户定义拷贝构造函数,C++不会再 提供其他构造函数
【注释】 学习课程为-黑马程序C++教程