c++中的几种特殊成员函数构造函数c++在编译器会给我们默认创建一个缺省的构造方法: 如下代码:
class father {public: string name = father; int age = 45; void print() { cout << name: << name << age: << age << endl; }};class son :public father {public: string sex = male;};void extendstest::maintest(){ son son; son.print();};运行结果:name:father age:45可以看到虽然我们没有明确声明构造方法,但是依然可以调用无参构造方法。这就是因为 编译器自动给我们创建了一个无参构造方法 、
如果类定义了自己的构造方法后(包括无参和有残),编译器就不会给我们创建了 ,看下面代码:
class father {public: father() { cout << father: << name << endl; } string name = father; int age = 45; void print() { cout << name: << name << age: << age << endl; }};class son :public father {public: son(){ cout << son: << name << endl; } string sex = male; };void extendstest::maintest(){ son son; son.print();};打印结果:father:fatherson:fathername:father age:45从上面代码也可以看出c++编译器会默认优先调用父类的构造方法,再调用子类的构造方法,
这点和java中是有区别的,java会从子类开始依次调用父类的构造方法,然后回溯子类的构造方法
所以为了保证对象的顺利创建,需要保证父类的构造方法是有效的。 如下代码:
class father {public: father(string _name):name(_name){ cout << father: << name << endl; } string name = father; int age = 45;};此时父类中创建了一个有参构造方法,前面说过,此时编译器不会创建默认的无参构造方法,则需要保证在其子类中有初始化父类的操作:即调用父类有参构造方法。 如下代码:
class son :public father {public: son(string name):father(name) { cout << son: << name << endl; } string sex = male;};void extendstest::maintest(){ son son1(myname);};结果:father:mynameson:myname析构函数析构函数用来释放当前对象使用到的内存空间,当对象跳出其作用域范围后就会执行析构函数( 除非是有智能指针出现循环引用的情况,无法释放,导致泄露 )。 c++中析构函数和构造函数相反,会 优先调用子类的析构函数再调用父类的析构函数 。 如下代码:
class father {public: ~father() { cout << ~father<< endl; } string name = father; int age = 45;};class son :public father {public: ~son() { cout << ~son << endl; } string sex = male; };void extendstest::maintest(){ son son;};运行结果:~son~father拷贝构造c++中拷贝构造函数格式:
格式1 :带const参数 complex(const complex& c) { … } 表示以常量对象作为参数格式2 :不带const参数 complex(complex& c) { … } 表示以非常量作为参数进行拷贝 如下代码:class complex { public: double real, imag; complex(double _real, double _imag): real(_real),imag(_imag) { cout << real: << real << imag: << imag << endl; } void print() { cout << real: << real << imag: << imag << endl; } complex(complex& c) { real = c.real+1; imag = c.imag+1; } };void extendstest::maintest(){ complex c1(1.0, 2.0); complex c2(c1); c2.print();};打印结果:real:1 imag:2real:2 imag:3拷贝构造函数和构造方法类似, c++编译器会给我们提供默认的拷贝构造函数 。 将上面代码的拷贝构造函数删除后:
class complex {public: double real, imag; complex(double _real, double _imag): real(_real),imag(_imag) { cout << real: << real << imag: << imag << endl; } void print() { cout << real: << real << imag: << imag << endl; }};void extendstest::maintest(){ complex c1(1.0, 2.0); complex c2(c1); c2.print();};依然可以执行拷贝构造,此时c2使用了默认拷贝构造函数进行赋值。
拷贝构造的几种调用形式:
1.当用一个对象去初始化同类的另一个对象时
complex c2(c1);complex c2 = c1;这两天语句是等价的。但是要 注意此时complex c2 = c1是一个初始化语句,并非一个赋值语句。赋值语句是一个已经初始化后的变量 。 如下:
complex c1, c2; c1 = c2 ;c1=c2;赋值语句不会触发拷贝构造 。
2.当对象作为一个函数形参时,此时也会触发对象的拷贝构造
class complex { public: double real, imag; complex(double _real, double _imag): real(_real),imag(_imag) { cout << real: << real << imag: << imag << endl; } complex(complex& c) { real = c.real+1; imag = c.imag+1; cout << complex copy << endl; } };void func(complex c) { cout << real: << c.real << imag: << c.imag << endl;}void extendstest::maintest(){ complex c(1.0,2.0); func(c);};运行结果:real:1 imag:2complex copyreal:2 imag:3可以看到运行结果触发了complex的拷贝构造 以对象作为函数的形参,在函数被调用时,生成的形参要用复制构造函数初始化,这会带来时间上的开销。 如果用对象的引用而不是对象作为形参,就没有这个问题了 。
void func(complex& c) { cout << real: << c.real << imag: << c.imag << endl;}但是以引用作为形参有一定的风险,因为这种情况下如果形参的值发生改变,实参的值也会跟着改变。 最好的方法就是将函数形参声明为const类型的引用 。
void func(const complex& c) { cout << real: << c.real << imag: << c.imag << endl;}3.对象作为函数返回值返回时,也会触发拷贝构造。
complex func() { complex c(1.0, 2.0); return c; } void extendstest::maintest() { cout << func().real << endl; };结果:real:1 imag:2complex copy2可以看到此时func函数中的return c处会触发一次拷贝构造,并将拷贝后的对象返回。 这点通过函数hack过程也可以看出来:此处call方法执行的是拷贝构造方法
为什么激光可以祛斑,你知道吗?
ST推出能够检测五个自由度的多传感器模块
dfrobot麦昆编程机器人小车巡线地图简介
光宝科技瞄准未来主流趋势,推出车用LED与传感器产品
一种应用于射频卡的集成稳压电路的设计
C/C++之面向对象编程思想2
电子电路图为例解析集成电路画法
PYNQ学习案例——Zynq中断应用及编程思路
区块链能否解决物联网设备的不安全问题
“华为天才少年”稚晖君创业项目,刚被百度投资了!
大规模MIMO测试在衰落信道数量和信号带宽方面有哪些特点优势?
宏展仪器为电池可靠性测试提供的性能保障
基于MT9P031视频图像处理系统
科普一下MR双射频技术的相关知识
基于人工智能的自监督学习详解
华为成立“煤炭军团”,看5G如何赋能老行业?
DFRobot 编码器套件介绍
不同的天线波束及其用途
中国联通在六个方面的努力
打破众多技术瓶颈,语音识别拾音器重磅推出