c++ 入门——浅析构造函数和析构函数

 更新时间:2020年08月31日 08:44:41   作者:从此启程  
这篇文章主要介绍了c++ 浅析构造函数和析构函数的相关资料,帮助大家入门c++ 编程,感兴趣的朋友可以了解下

前文回顾

本文档环境基于Vscode + GCC + CodeRunner

关于C++的环境搭建请参考下面链接:

https://www.jb51.net/article/186542.htm

由于本人具有C#开发经验,部分相同的知识就不再赘述了。只列一下需要记录的知识。

HelloWorld

cout 代表输出<<

cin 代表输入 >>

endl;代表换行,清空缓冲区。

#include <iostream>
int main()
{
 std::cout << "Helloworld22222222222!" << std::endl;
 return 0;
}

RunCode结果如下:

PS E:\LearchC\TestOne> cd "e:\LearchC\TestOne\" ; if ($?) { g++ -fexec-charset=GBK -std=c++11 1-HelloWord.cpp -o a.exe } ; if ($?) { ./a.exe }
Helloworld22222222222!

使用命名空间

#include <iostream>
using namespace std;
int main()
{
 cout << "请输入一个数字!" << endl;
 int a;
 cin >> a;
 cout << "你输入的是" << a << endl;
 return 0;
}

RunCode结果如下:

请输入一个数字!
2
你输入的是2

构造函数和析构函数

  • 构造函数的作用:用于新建对象的初始化工作。
  • 析构函数的作用:用于在撤销对象前,完成一些清理工作,比如:释放内存等。

每当创建对象时,需要添加初始化代码时,则需要定义自己的构造函数;而对象撤销时,需要自己添加清理工作的代码时,则需要定义自己的析构函数。

按参数类型

  • 无参构造函数
  • 有参构造函数
  • copy构造函数
#include <iostream>
using namespace std;
class Person
{
public:
 int _a;

public:
 //无参构造函数
 Person()
 {
 cout << "Person 构造函数的调用" << endl;
 }
 //有参构造函数
 Person(int a)
 {
 _a = a;
 cout << "Person构造函数A:" << a << endl;
 }
 Person(const Person &p)
 {
 _a = p._a;
 cout << "PersonCopay构造函数_a:" << _a << endl;
 }
 //析构函数
 ~Person()
 {
 cout << "Person 析构函数的调用" << endl;
 }
};
void test(){
 Person p1;
}
int main(){
 test();
system("pause");
return 0;
}

RunCode结果如下:

test方法结束后,会调用析构函数。

Person 构造函数的调用
Person 析构函数的调用

改变调用方式,在main里调用,将只出现调用构造函数,因为main函数后面pause暂停,不会释放Person的析构。

int main(){
Person p1;
system("pause");
return 0;
}

RunCode 结果如下

Person 构造函数的调用

按调用方式

  • 括号法
  • 显示调用
  • 隐式调用
void test01()
{

 //括号法
 // Person p1; //默认
 // Person p2(2); //有参
 // Person p3(p2); //copy构造函数
 // cout << "p2的age:" << p2._a << endl;
 // cout << "p3的age:" << p3._a << endl;

 //调用默认函数不能加()
 //因为下面这行代码编译器会认为是函数的声明,不会创建对象
 //Person p4();

 //显示法
 // Person p1;
 // Person p2 = Person(10);
 // Person p3 = Person(p2);

 // Person(10); //匿名对象,这行执行完毕,立即释放
 //注意事项2:不要用copy构造函数初始化匿名对象,编译器会认为Person (p3)==Person p3;
 //Person(p3);
 //cout << "P2-Age:" << p3._a << endl;

 //隐式转换法
 Person p1 = 10; //相当于写了Person p1=Person(10)
 Person p2 = p1; //相当于copy构造
}

注意事项:

不要用copy构造函数初始化匿名对象;

调用默认函数不能加();

调用规则

默认情况下,C++编译器至少给一个类添加三个函数
1.默认构造函数(无参)
2.默认析构函数
3.默认拷贝构造函数,对属性进行值拷贝

构造函数调用规则如下:

  • 如果用户定义有参构造函数,c++不在提供默认无参噶构造函数
  • 如果用户定义拷贝构造函数,c++不会再提供其他构造函数

总结

第三种隐式转换法,我看的有点头晕,写法太多。java和C#在构造函数这块调用方法做了简化,只能用new来创建对象。

正所谓:华山自古一条道,好好的走吧!

以上就是c++ 入门——浅析构造函数和析构函数的详细内容,更多关于c++ 构造函数和析构函数的资料请关注脚本之家其它相关文章!

相关文章

  • VisualStudio 使用Visual Leak Detector检查内存泄漏

    VisualStudio 使用Visual Leak Detector检查内存泄漏

    这篇文章主要介绍了VisualStudio 使用Visual Leak Detector检查内存泄漏的相关资料,需要的朋友可以参考下
    2015-07-07
  • C语言实现经典排序算法的示例代码

    C语言实现经典排序算法的示例代码

    这篇文章主要为大家详细介绍了如何利用C语言实现经典排序算法中的冒泡排序、选择排序、插入排序、希尔排序,文中的示例代码讲解详细,需要的可以参考一下
    2022-08-08
  • C语言也有封装,继承和多态你知道吗

    C语言也有封装,继承和多态你知道吗

    这篇文章主要为大家详细介绍了C语言封装,继承,多态,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C/C++自主分配出现double free or corruption问题解决

    C/C++自主分配出现double free or corruption问题解决

    这篇文章主要为大家介绍了C/C++出现double free or corruption问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • linux c语言操作数据库(连接sqlite数据库)

    linux c语言操作数据库(连接sqlite数据库)

    linux下c语言操作sqlite数据库实例方法,大家参考使用吧
    2013-12-12
  • 全排列算法的原理和实现代码

    全排列算法的原理和实现代码

    这篇文章主要介绍了全排列算法的原理和实现代码,全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个,需要的朋友可以参考下
    2014-08-08
  • c语言动态数组示例

    c语言动态数组示例

    这是一个简单的动态分配数组大小的例子,需要的朋友可以参考下
    2014-04-04
  • C++详细分析线程间的同步通信

    C++详细分析线程间的同步通信

    线程间不通信的话,每个线程受CPU的调度,没有任何执行上的顺序可言,线程1和线程2是根据CPU调度算法来的,两个线程都有可能先运行,是不确定的,线程间的运行顺序是不确定的,所以多线程程序出问题,难以复现,本章我们就来了解线程间的同步通信
    2022-05-05
  • 解析如何利用switch语句进行字符统计

    解析如何利用switch语句进行字符统计

    本篇文章是对如何利用switch语句进行字符统计的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Qt利用QJson实现解析数组的示例详解

    Qt利用QJson实现解析数组的示例详解

    这篇文章主要为大家详细介绍了Qt如何利用QJson实现解析数组功能,文中的示例代码讲解详细,对我们学习Qt有一定帮助,需要的小伙伴可以了解一下
    2022-10-10

最新评论