c++ 构造函数和析构函数 c++ 入门——浅析构造函数和析构函数
从此启程 人气:0前文回顾
本文档环境基于Vscode + GCC + CodeRunner
关于C++的环境搭建请参考下面链接:
由于本人具有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来创建对象。
正所谓:华山自古一条道,好好的走吧!
加载全部内容