c++ 赋值构造函数
构造函数主要包括:默认构造函数、普通构造函数、拷贝构造函数三种。构造函数经常与赋值函数混淆,这里放在一起讲,便于区分。
首先初始化一个简单的类作为例子讲解:
classA{public:A(){
v =1;printf("默认构造(无参数)\n");}A(int t =1){
v =1;printf("默认构造(有参数,且参数有默认值)\n");}A(int t){
v = t;printf("普通构造1\n");}A(int t,int f){
v = t;
m = f;printf("普通构造2\n");}A(const A& a){this->v = a.v;printf("拷贝构造\n");}
A&operator=( A& a){this->v = a.v;printf("赋值函数\n");return*this;}~A(){printf("析构函数\n");}i
nt v;int m;};
1、 默认构造函数
①准确的说,默认构造函数就是在调用时不需要显示地传入实参的构造函数。②一个类只能有一个默认构造函数。
1.1、默认构造函数
当类中没有定义任何构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空。此外,用户可自定义默认构造函数如下。
实现形式:
A(){}A(int t =1){
v = t;}
上述两种默认构造函数不能同时存在,否则在调用默认构造函数时会引起二义性。
调用形式:
intmain(){
A a;return0;}
*C++构造函数重载以及默认参数引起的二义性
问题解析
当我们同时定义一个带默认参数的默认构造函数和一个不带参数的默认构造函数之后(一般不这样做,两种构造函数不应被同时定义),在定义一个类对象时,如果不传递参数,会出现二义性错误。因为我们没有传递参数时,系统默认又两种选择,一种是调用无参的默认构造函数,另一种是调用带参默认构造函数并传递默认参数。
classA{public:A(){
v =0;}A(int r =0){
v = r;}int v;};intmain(){
A c;return0;}
会报错:error: call of overloaded ‘Complex()’ is ambiguous
解决方法
1.去掉无参默认构造函数。
classA{public:A(构造函数可以被重载int r =0){
v = r;}int v;};
这时,当我们不给构造函数传递参数时,系统会调用有参默认构造函数并传递默认参数对类数据成员进行初始化。
intmain(){
A a;
A a(0);return0;}
2.去掉带参默认构造函数的默认参数
classA{public:A(){
v =0;}A(int r){
v = r;}int v;};
此时带参默认构造函数就变成了普通构造函数。
1.2、默认拷贝构造函数
当类中没有定义任何拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,简单的进行成员变量的值的赋值。这里涉及到深拷贝和浅拷贝的知识,将在拷贝构造函数小节详述。
2、 普通构造函数
实现形式:
A(int t){
v = t;}A(int t,int f){
v = t;
m = f;}A(int t):v(a){}A(int t,int f):v(a),m(f){}
调用形式:
intmain(){
A a(1);
A a(1,1);return0;}
3、 拷贝构造函数(复制构造函数)
实现形式:
A(const A& a){this->v = a.v;printf("拷贝构造\n");}
调用形式(三种情况):
3.1、对象需要通过另一个对象进行初始化
intmain(){
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论