C++Note 构造析构分类及调用
两种分类方式:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
三种调用方式:
括号法
显示法
隐式转换法
1 #include <iostream> 2 using namespace std; 3 4 //构造函数的分类及调用 5 //分类 6 //按照参数分类 无参构造(默认构造)和有参构造 7 //按照类型分类 普通构造和拷贝构造 8 class Person 9 { 10 public: 11 //构造函数 12 Person() 13 { 14 cout << "Person无参构造函数的调用" << endl; 15 } 16 Person(int a) 17 { 18 age = a; 19 cout << "Person有参构造函数的调用" << endl; 20 } 21 //拷贝构造函数 22 Person(const Person &p) // ***拷贝 Person p 但需要限制 加 const 为了表明数据传入进来后不会被改变 后用&p(如果直接用Person p 可能会导致无限递归调用栈溢出)*** 23 { 24 //将传入的人p的属性拷贝到 我的身上 25 cout << "Person拷贝构造函数的调用" << endl; 26 age = p.age; 27 } 28 //析构函数 29 ~Person() 30 { 31 cout << "Person析构函数的调用" << endl; 32 } 33 int age; 34 }; 35 //调用 36 void test01() 37 { 38 //Person p1;//默认构造函数调用 39 ////1.括号法 40 //Person p2(10);//有参构造函数 41 //Person p3(p2);//拷贝构造函数 42 43 //***注意事项: 调用默认构造函数的时候 不要加() 44 //***Person p1(); 错误 编译器认为这是一个函数声明 不会认为在创建对象 45 46 //cout << "p2的年龄为: " << p2.age << endl;// 初始化写入10 47 //cout << "p3的年龄为: " << p3.age << endl;// 拷贝p2到p3 10 48 49 //2.显示法 50 Person p1;// 默认:无参 51 Person p2 = Person(10);//有参 52 Person p3 = Person(p2);//拷贝 53 //Person(10);// 匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象 54 //***注意事项2:不要利用拷贝构造函数 初始化匿名对象 55 //***Person(p3);//错误:重定义 编译器会认为 Person(p3) == Person p3; 56 57 //3.隐式转换法 58 Person p4 = 10;//等同于 Person p4 = Person(10); 有参构造 59 Person p5 = p4;//拷贝构造 60 } 61 int main() 62 { 63 test01(); 64 system("pause"); 65 return 0; 66 }
如果允许复制构造函数传值,就会在复制构造函数内调用复制构造函数,就会形成永无休止的递归调用从而导致栈溢出。
class A { private: int value; public: A(int n){value = n;} A(A other){value = other.value;}//错误案例 void Print(){std::cout<<value<<std::endl;} };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)