浅谈c++构造函数问题,初始化和赋值问题
默认构造函数(就是没有参数的构造函数)
TheDefaultConstructor
Thedefaultconstructoristheconstructorusedtocreateanobjectwhenyoudon'tprovideexplicitinitializationvalues.Thatis,it'stheconstructorusedfordeclarationslikethis:
Stockstock1; //usesthedefaultconstructor
1、由编译器自动生成
2、由我们自己定义的
这里又有两种情况
上面说了啊,defaultconstructor有两种(……yourowndefaultconstructor.Thisisaconstructorthattakesnoarguments):
1)Oneistoprovidedefaultvaluesforalltheargumentstotheexistingconstructor:
Stock(constchar*co="Error",intn=0,doublepr=0.0);
2)Thesecondistousefunctionoverloadingtodefineasecondconstructor,onethathasnoarguments:
Stock();
有一点注意的时候两者不能同时使用:
Youcanhaveonlyonedefaultconstructor,sobesurethatyoudon'tdoboth.(WithearlyversionsofC++,youcoulduseonlythesecondmethodforcreatingadefaultconstructor.)
Thisisaconstructorthattakesnoarguments:这个指的是调用的时候不带参数。
编译器自动添加默认构造函数的条件:编译器实现的构造函数其实就是什么都不做
1.没有任何自己定义的构造函数(即便是复制构造函数也不行,如果自己定义复制构造函数,则必须自己定义构造函数)
2、数据成员中没有const和reference。--因为要初始化。
拷贝构造函数的参数必须是引用的原因:拷贝构造函数的参数使用引用类型不是为了减少一次内存拷贝,而是避免拷贝构造函数无限制的递归下去。
如果是值的话,那在传值的时候还要再调一次拷贝构造函数
然后又要传值,又要再调一次....
然后你就内存不够,当了
关于赋值==函数和拷贝构造函数的区别:
#include<iostream> usingnamespacestd; classA {public: inti; A(constA&a) {i=a.i; cout<<"copyisbuild"<<endl; } explicitA(inty) {i=y; } }; Afun(Ai) {Aa1(i); Aa2=a1;//其实就调用拷贝构造函数 returna2; } intmain() {Aa(1); fun(a); }
拷贝构造函数一共调用四次拷贝构造函数。。fun参数传值一次,a1(i)一次,a2(a1)一次,return的时候构造临时对象一次
如果函数返回对象,而不是指针,那么在执行return的时候,会使用被return的对象“复制构造”临时对象,然后,return语句执行完毕(遇到分号;了)函数内部创建的全部变量析构、出栈。而被“赋值构造”的临时对象则在调用该函数的语句执行完毕(遇到分号;或者右边的大括号})后,析构。
总结一句:
临时变量的生存范围是语句级——分号;结束或者右边的大括号}结束。语句结束之后,临时变量就被析构了~
以上就是小编为大家带来的浅谈c++构造函数问题,初始化和赋值问题全部内容了,希望大家多多支持毛票票~