c++之对象的初始化和清理
时间:2022-07-23
本文章向大家介绍c++之对象的初始化和清理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在生活中我们购买单电子产品通常都会有出厂设置,在某一天我们不用也会删除一些自己的数据信息以保证安全。
c++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁清理数据的设置。
1.构造函数和析构函数
对象的初始化和清理也是两个非常重要的安全问题:
- 一个对象或者变量没有初始状态,对其使用后结果未知。
- 同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题。
c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制我们做的事情,因此如果我们不提供构造函数和析构函数,编译器会提供编译器提供的构造函数和析构函数的空实现。
什么是构造函数?
主要作用于创建对象时为对象的成员属性进行赋值。
什么是析构函数?
主要作用于对象在销毁时执行一些清理工作。
构造函数语法:类名(){}
- 构造函数,没有返回值也不写void
- 函数名与类名相同
- 构造函数可以有参数,因此可以重载
- 程序在创建对象时会自动调用构造函数,而且只会调用一次
析构函数语法:~类名(){}
- 析构函数,没有返回值也不写void
- 函数名与类名相同,在名称前面jiahsang~
- 构造函数不可以有参数,因此不能重载
- 程序在对象销毁时会自动调用析构函数,而且只会调用一次
#include<iostream>
using namespace std;
class Student {
string name;
int age;
double score;
public:
//构造函数
Student(){
cout << "调用构造函数" << endl;
}
//析构函数
~Student() {
cout << "调用析构函数" << endl;
}
};
void test() {
//在栈上的数据,test执行完毕之后就会被释放
Student s;
}
int main() {
test();
system("pause");
return 0;
}
2.构造函数的分类以及调用
两种分类方式:有参构造、无参构造;普通构造、拷贝构造;
三种调用方式:括号法、显示法、隐式替换法;
#include<iostream>
using namespace std;
class Student {
string name;
int age;
double score;
public:
//无参构造函数
Student(){
cout << "调用Student()构造函数" << endl;
}
//有参构造函数
Student(string name,int age) {
cout << "调用Student(string name,int age)构造函数" << endl;
}
//拷贝构造函数
Student(const Student &stu) {
name = stu.name;
age = stu.age;
score = stu.score;
cout << "调用拷贝构造函数" << endl;
}
//析构函数
~Student() {
cout << "调用Student()析构函数" << endl;
}
};
void test() {
//匿名对象,当前行运行完后就会调用析构函数
//不要使用拷贝构造函数初始化匿名对象:Student(s2);
Student();
//隐式三种形式
cout << "隐式调用" << endl;
Student s1;
Student s2{"tom",12};
Student s3{ s2 };
//显示三种形式
cout << "显示调用" << endl;
Student s4 = Student();
Student s5 = Student("bo",22);
Student s6 = Student(s5);
//隐式转换法,相当于Student s7 = Student{ "mike",17 };
Student s7 = { "mike",17 };
}
int main() {
test();
system("pause");
return 0;
}
输出:
3.拷贝构造函数的调用时机
c++拷贝构造函数调用时有三种情况:
- 使用一个已经创建完毕的对象来初始化一个新对象;
- 值传递的方式给函数参数传输;
- 以值方式返回局部对象;
即这三种情况下都会调用拷贝构造函数。
#include<iostream>
using namespace std;
class Person {
public:
int m_age;
public:
Person() {
cout << "Person默认构造函数" << endl;
}
Person(int age) {
m_age = age;
cout << "Person(int age)构造函数" << endl;
}
Person(const Person& p) {
m_age = p.m_age;
cout << "拷贝构造函数" << endl;
}
~Person() {
cout << "Person析构函数" << endl;
}
};
//使用一个已经创建完毕的对象来初始化一个新对象
void test() {
Person p1(22);
Person p2(p1);
cout << "p2的年龄是:" << p2.m_age << endl;
}
void doWork(Person p) {}
//使用值传递的方式
void test2() {
Person p;
doWork(p);
}
//值返回局部对象
Person doWork2() {
Person p1;
return p1;
}
void test3() {
Person p = doWork2();
}
int main() {
test3();
system("pause");
return 0;
}
4.构造函数的调用规则
默认情况下,c++编译器至少会给一个类添加三个函数:
- 默认无参构造函数
- 默认析构函数;
- 默认拷贝构造函数,对属性进行值拷贝;
构造函数调用规则如下:
- 如果用户自定义构造函数,c++不再提供无参构造函数,但是会提供拷贝构造函数;
- 如果用户自定义拷贝构造函数,c++不会再提供其它构造函数;
- 第三课:把tensorflow,模型和测试数据导入Android工程
- D-Link 路由器信息泄露和远程命令执行漏洞分析及全球数据分析报告
- Wordpress安全架构分析
- CVE-2017-5123 漏洞利用全攻略
- 简单分析shared pool(三) (r5笔记第94天)
- OpenCV在车道线查找中的使用
- ESP32 DevKitC 编译烧写 AliOS Things
- 使用R完成K近邻分类
- 使用R完成逻辑斯蒂回归分类 直接上代码,如下:
- 基于时间点的不完全恢复的例子(r6笔记第9天)
- R-正太分布,检验
- R完成--决策树分类 一个使用rpart完成决策树分类的例子如下:
- Apollo的数据开放平台介绍
- 手把手教你运行apollo
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【一天一大 lee】两数相加 (难度:中等) - Day20201004
- 历经14天自定义3个注解解决项目的3个Swagger难题
- 【一天一大 lee】秋叶收藏集 (难度:中等) - Day20201001
- 【译文】Facebook工程师谈运维工作的未来
- 【一天一大 lee】环形链表II (难度:中等) - Day20201010
- 【西法带你学算法】一次搞定前缀和
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
- 求求你别再用System.out.println 了!!
- 为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?
- 独家 | 教你用Python来计算偏差-方差权衡
- 使用 KinD 加速 CI/CD 流水线
- 使用 Docker 加速开发工作流
- Kubernetes CRD 自定义控制器
- 推荐算法之: LFM 推荐算法
- 推荐算法之: DeepFM及使用DeepCTR测试