目录
成都创新互联"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!成都创新互联具备承接各种类型的网站制作、做网站项目的能力。经过十余年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。默认拷贝构造函数
拷贝构造函数的原型:
为什么不用值传递?
为什么不用指针传递?
调用拷贝构造函数的3种情况 (旧对象去构造新对象)
我们熟悉的类型有以下操作:
1.声明:int a;
2.声明并初始化:int a = 10;
3.赋值:int a = 10;int b = a;
类作为一个类型当然也有以上操作,其中默认的构造函数可以完成操作1,人为建立的构造函数可以完成操作2,3。对于第三种操作,类中也提供了默认的函数——拷贝构造函数。
默认拷贝构造函数类会提供一个默认的拷贝构造函数,用已有对象的值去依此初始化新对象的值;如果人为提供了,则类不会提供默认。
拷贝构造函数又叫复制构造函数。
拷贝构造函数的原型:类名(const 类名& 形参名) :(初始化列表){}
可以看到,这里是引用传递,加了const防止值被修改
为什么不用值传递?值传递将待传的值赋值一份过去,形参需要初始化,如果使用值传递,像下面这样,程序会掉入死循环:
假如有:A a = 10;A b(a);
将a传入成员b时调用拷贝构造函数A(A t);
而A(A t)函数中的形参成员t需要初始化,这又需要调用拷贝构造函数A(A t);
如此下去不断调用拷贝构造函数,无穷无尽。
class A
{
public:
A(int i = 0) :m_i(i) { cout<< "A"<< m_i<< endl; }
~A() { cout<< "~A"<< m_i<< endl; }
A(A t) :m_i(t->m_i)//值传递
{
cout<< "A(A)"<< endl;
}
void print() { cout<< m_i<< endl; }
private:
int m_i;
};
为什么不用指针传递?A(A* t) :m_i(t->m_i)
{cout<< "A(A)"<< endl;}
其实指针传递的结果是对的,但是看的时候有歧义
A a = 10;A b = &a;//人们无法确定是用a初始化b,还是用&a初始化b;A b(&a)的作用同A b = &a
调用拷贝构造函数的3种情况 (旧对象去构造新对象)1.用已有对象去初始化新对象
2.函数传参--值传递 由实参传递给形参的过程
3.函数返回值 --类类型的值返回,由局部对象构造临时对象
情况1很好理解
A a(5); //A(int) 5
A b(a);//用a去初始化b对象
情况2就是拷贝构造函数为什么不用值传递的原因
void fun(A t){}
情况3在const关键字那篇中提到过,函数传参时不是把本身的变量传过去,而是生成一个临时存储空间,这个临时的空间如果是类类型的则需要调用拷贝构造函数。
A fun(){}
最后看一下这些函数的调用:
class A
{
public:
A(int i = 0) :m_i(i) { cout<< "A"<< m_i<< endl; }
~A() { cout<< "~A"<< m_i<< endl; }
A(const A& t) :m_i(t.m_i) //拷贝构造函数
{
cout<< "A(A)"<< m_i<< endl;
}
void print() { cout<< m_i<< endl; }
private:
int m_i;
};
void fn(A s) //A s(c) 用c构造s 调用拷贝构造 A(A) 30
{
cout<< "fn"<< endl;
//fn在即将退出的时候,要将局部对象s析构 ~A 30
}
A test()
{
A tt(60); //A 60
return tt; //从tt到临时对象调用拷贝构造
}
void main()
{
A a(5);
A b(a);
A c(30); //调用普通构造 A 30
fn(c);
c = test();
}
结果:
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧