浅谈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++构造函数问题,初始化和赋值问题全部内容了,希望大家多多支持毛票票~