构造、拷贝构造、赋值
来源:互联网 发布:java调用浏览器下载 编辑:程序博客网 时间:2024/04/30 11:02
构造函数
注意:
- 构造函数初始化列表的初始顺序,是根据类数据变量的声明顺序
拷贝构造函数
调用拷贝构造函数的三种情况:(先拷贝,在构造,整个过程叫拷贝构造)
用一个对象创建另一个对象时候
在调用函数时需要将实参对象内容传递给形参时候
函数返回值是类对象时(而非引用或指针)
赋值
重载 =
三者放一起比较
#include <iostream>#include <string>class C1 { std::string name;public: C1(const std::string &name): name(name){ std::cout << "构造" << name << std::endl; } C1(const C1 &other): name(other.name) { std::cout << "拷贝" << name << std::endl; } C1 operator =(const C1 &other) { std::cout << "赋值" << name << std::endl; return other; // 在此处调用拷贝。先利用other创建一个临时对象 }};void copy1(C1 &left, C1 &right) { // 这也是赋值过程,然而不是传内容,是传地址 std::cout << __func__ << std::endl; left = right; // 调用赋值,参数是right,也是就是c2。利用赋值产生临时变量构造Left,整个过程叫拷贝构造,调用拷贝}void copy2(C1 left, C1 right) { // 相当于C1 left = c1, C2 right = c2,函数参数传递的过程就是赋值过程。拷贝 std::cout << __func__ << std::endl; left = right;}C1 ©3(C1 &right) { std::cout << __func__ << std::endl; return right; // 在此时调用拷贝,创建出一个临时对象}C1 copy4(C1 right) { std::cout << __func__ << std::endl; return right;}int main(int argc, const char * argv[]) { C1 c1("c1"); C1 c2("c2"); copy1(c1,c2); std::cout << "mark1" << std::endl; copy2(c1, c2); std::cout << "mark2" << std::endl; C1 c3(copy3(c2)); // 先拷贝产生临时对象,然后构造c3,整个过程就是拷贝构造,调用一次拷贝构造函数// C1 c3 = copy3(c2); 这2句是相同的,都是对c3的初始化。 std::cout << "mark3" << std::endl; C1 c4 = copy4(c2); return 0;}
函数参数传递的过程就是赋值过程。
1
C1 c1("c1");C1 c2("c2");
简单构造就不解释了
输出:
构造c1
构造c2
2
copy1(c1,c2);std::cout << "mark1" << std::endl;
输出:
copy1
赋值c1
拷贝c2
mark1
copy1()的形参是引用,在调用函数时候传入的实参也是赋值过程,不过赋值的是地址而不是内容,所以不调用拷贝构造。
left = right;调用赋值函数,参数是right,也是就是c2。然后利用赋值产生临时变量构造Left(然后自己被析构),整个过程叫拷贝构造,调用拷贝
3
copy2(c1, c2);std::cout << "mark2" << std::endl;
输出:
拷贝c1
拷贝c2
copy2
赋值c1
拷贝c2
mark2
copy2()的形参是普通的对象类型,因此调用拷贝构造函数构造局部变量left和right.相当于C1 left = c1; C1 right = c2;
其后语句同2
4
C1 c3(copy3(c2)); std::cout << "mark3" << std::endl;
输出:
copy3
拷贝c2
mark3
先拷贝产生临时对象(然后析构自己),然后构造c3(然后析构临时对象),整个过程就是拷贝构造,调用一次拷贝构造函数
(如果写出返回引用,目的是提高效率,不许要那么多拷贝和临时变量)
这句话也相当于 C1 c3 = copy3(c2); 都是对c3的初始化。
5
C1 c4 = copy4(c2);
输出:
拷贝c2
copy4
拷贝c2
不解释了。。。
0 0
- 构造、拷贝构造、赋值
- 拷贝构造 赋值构造
- 拷贝构造和赋值构造
- 构造&转换&拷贝&赋值
- 拷贝,赋值构造函数赋值
- 拷贝构造和拷贝赋值
- 拷贝构造与拷贝赋值
- c++构造,拷贝构造,拷贝赋值,移动构造,移动赋值
- 拷贝构造函数和赋值构造函数
- 拷贝构造函数与赋值构造函数
- 拷贝构造函数与赋值构造函数
- C++ 拷贝构造函数 赋值构造函数
- 拷贝构造函数与赋值构造函数
- 构造函数 拷贝函数 赋值构造函数
- 拷贝构造函数和赋值构造函数
- 拷贝构造函数 赋值构造函数
- 构造函数,拷贝构造函数,和赋值
- 赋值构造函数和拷贝构造函数
- 把jar包拷到WEB-INF/lib和放到工程之外的路径作为library引用有什么不同?
- 一些常用算法的代码(2)
- [置顶] oracle 内连接(inner join)、外连接(outer join)、全连接(full join)
- 内存缓存LruCache源码解析
- 整理出来的一个windows关机、锁定、重启、注销 API调用
- 构造、拷贝构造、赋值
- 有异步请求时注意程序执行的顺序
- 常用函数
- NYOJ113题字符串的替换
- ubuntu16下caffe终于编译成功
- 源码-PL/SQL从入门到精通-第三章-变量和类型-Part 2
- Java常见异常总结
- 第一天软件测试总结
- 微信公众号开发教程[010]-消息管理-获取公众号的自动回复规则