尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

记录C++ 5

记录C++ 5 构造函数概念类中没有构造函数时编译器会送2个函数一个构造函数一个拷贝构造函数在构造对象时自动调用此函数一般用来初始化对象内的成员变量构造函数无返回值不需要传参就可以调用的构造函数称为无参构造函数构造函数可以根据自己的需求进行重载或者带默认值在没有Set函数时一般建议初始化列表进行初始化对象委托构造函数如果一个类中重载了多个构造函数且每个构造函数需要对某些变量进行初始化这时候就会出现很多重复代码允许同一个类中一个构造函数可以调用另外一个构造函数从而可以在初始化时简化变量的初始化拷贝构造函数拷贝构造函数一般用在主动创建对象时用一个对象去初始化另一个对象Circle::Circle(const Circle c) { rc.r; xc.x; yc.y; } int main() { Circle a; Circle a(b); Ciecle cb; }一个对象以值行式传入函数体一个对象以值的形式从函数返回,编译器会对此进行优化using namespace std; class A { public: A(); //构造函数 A(const a);//拷贝构造函数 private: int x; }; A::A() //构造函数的实现 { x0; } A::A(const A a) //拷贝构造函数的实现 { xa.x; } A ceshi() //编写一个函数返回一个A类对象 { A a; return a; } int main() { ceshi(); //调用ceshi函数()会调用一次拷贝构造函数 A aceshi(); //将ceshi返回的对象接受再次调用一次拷贝构造函数此行会调用2次拷贝构造函数 return 0 }深拷贝与浅拷贝默认的拷贝构造函数为浅拷贝针对指针对象只拷贝指针存储的地址深拷贝针对指针对象拷贝指针指向的空间#include iostream using namespace std; class A { public: A (int i10,int j20):i(i),j(new int (j))//默认浅拷贝 { } A(const A other) : i(other.i),j(new int (*other.j))//成员变量存在指针有拷贝需求(函数的值传递) 深拷贝 { } int i; int *j; }; int main() { A a; A aaa; cout aa.j endl; cout *aa.jendl; cout a.jendl; cout *a.jendl; return 0; }移动构造函数指将其他对象拥有的内存资源移为已用解决拷贝构造函数在拷贝右值时带来过多的开销问题原理当同时存在拷贝构造函数和移动构造函数时使用临时对象初始化当前类的对象编译器会优先调用移动构造函数当类中没有合适移动构造函数编译器才会使用拷贝构造函数explicit只用来修饰类的构造函数最好只修饰只有一个参数的构造函数被修饰的构造函数不能发生相应的隐式类型转换只能以显示的方式进行类型转换何时触发隐式拷贝析构函数1 一个对象作为函数参数以值传递的方式传入函数体2 一个对象作为函数返回值以值传递的方式从函数返回3 以A ab的方式构造a,其中b也是A类型析构函数在销毁对象时自动调用此函数用来释放对象类申请的资源与类名相同在前面加位取反符号~没有任何参数和返回值特点没有参数和返回值不能用const修饰
返回列表