由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++拷贝构造函数是干啥的?
相关主题
C++的"初始化"小结为啥gcc找不到类的构造函数?
还没被劝退C++的都来看看这个吧构造函数里的异常处理
simple question on C++ initialization listvector的析构问题
C++构造函数的问题[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?
c++类未完成初始化,如何引用this?C++里,Base Class如何调用Derived Class的method
关于构造函数的一道测试题 (转载)刚看完类这一章,有些大小问题,请指教,谢谢
请教c++数组初始化protected构造函数可以防止slicing是什么意思?
[合集] 关于构造函数C/C++函数调用和栈内存
相关话题的讨论汇总
话题: 拷贝话题: 构造函数话题: 复制话题: c++话题: 调用
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
我们公司的项目中定义了和业务相关的类,比如Well, Workspace, 各类Model等。这些
类在系统中形成树形结构,所以每个成员都有Parent,为此,每个类都是一个基类的子
类,这个基类有Parent,是基类的指针。
现在出现了争论,就是拷贝构造函数是干嘛的。我认为,拷贝要拷贝所有的东西,是C+
+语法需要的。而架构师认为,拷贝是给用户复制一个树用的。
具体:
我认为,拷贝是为了C++编译器用的,当我们把一个语句编译的时候,编译器有的时候
需要调用我们的拷贝构造,有的时候需要调用移动赋值等。比如
auto temp = std::make_unique<...>(*it->get());这里就是调用拷贝构造
而各类的std::vector>里面如果删减则调用shared_ptr的move
assignment,或者copy assignment。这是应C++语法的要求。
架构师认为,用户复制一个树的时候,比如复制一个Well, 被复制的不能拥有同一个
Parent,不能指向同一个目录等。但为认为应该定义另一个函数用来复制,比如叫
Clone,来完成他的不完全复制。
大家怎么说?
h**l
发帖数: 168
2
一般情况下copy constructor is copy by value.
对指针成员变量的处理是由你们的业务逻辑决定的,和C++语法无关。
b***i
发帖数: 3043
3
一个例子
vector all;
all.reserve(2);
all.push_back(1);// id = 1
all.push_back(2);// id = 2
all.erase(all.begin());//此时调用拷贝构造函数或者移动构造,但是我们的两个函
数不复制id,所以
all.begin()->showId();//显示0.因为我们的拷贝构造是给业务逻辑用的,不是给其他
库用的。但是这样这个vector存的东西都变了。

【在 h**l 的大作中提到】
: 一般情况下copy constructor is copy by value.
: 对指针成员变量的处理是由你们的业务逻辑决定的,和C++语法无关。

r*****z
发帖数: 906
4
如果你们的类处于特定的原因,不愿意提供拷贝构造函数而希望要求用户使用clone这
样的方式,那么应该把拷贝构造函数deleted。这样,你上面的代码就根本不能编译了
。事实上,如果不提供拷贝构造函数的理由是充分的的话,这种限制(比如很多标准容
器相关的用法会不允许)也将是合理的。这不是语言问题。
h**l
发帖数: 168
5
你们自己的程序是在什么情况下调用拷贝构造函数的? 为什么你们的拷贝构造函数和
移动构造函数不复制id?指针成员变量的处理比较复杂一些,id应该是primitive type
, 为什么要特殊处理?
可能像楼上说的,你们这个类的对象就不适合被拷贝,直接disable掉,你们用你们自
己的函数来拷贝就好了。

【在 b***i 的大作中提到】
: 一个例子
: vector all;
: all.reserve(2);
: all.push_back(1);// id = 1
: all.push_back(2);// id = 2
: all.erase(all.begin());//此时调用拷贝构造函数或者移动构造,但是我们的两个函
: 数不复制id,所以
: all.begin()->showId();//显示0.因为我们的拷贝构造是给业务逻辑用的,不是给其他
: 库用的。但是这样这个vector存的东西都变了。

b***i
发帖数: 3043
6
我同意你的观点,好不容易劝说了几个人接受这个观点。

【在 r*****z 的大作中提到】
: 如果你们的类处于特定的原因,不愿意提供拷贝构造函数而希望要求用户使用clone这
: 样的方式,那么应该把拷贝构造函数deleted。这样,你上面的代码就根本不能编译了
: 。事实上,如果不提供拷贝构造函数的理由是充分的的话,这种限制(比如很多标准容
: 器相关的用法会不允许)也将是合理的。这不是语言问题。

b***i
发帖数: 3043
7
在需要半复制,半构造的时候,就是把一个树的结构复制,每个节点半复制(名字可以
一样,但是id不一样,父节点指针也不一样),所以不能复制id和父节点指针。

type

【在 h**l 的大作中提到】
: 你们自己的程序是在什么情况下调用拷贝构造函数的? 为什么你们的拷贝构造函数和
: 移动构造函数不复制id?指针成员变量的处理比较复杂一些,id应该是primitive type
: , 为什么要特殊处理?
: 可能像楼上说的,你们这个类的对象就不适合被拷贝,直接disable掉,你们用你们自
: 己的函数来拷贝就好了。

1 (共1页)
进入Programming版参与讨论
相关主题
请教c++里函数调用的问题c++类未完成初始化,如何引用this?
[合集] 几道面试问题关于构造函数的一道测试题 (转载)
纯虚函数问题请教c++数组初始化
[合集] call-by-ref降低了C++程序可读性[合集] 关于构造函数
C++的"初始化"小结为啥gcc找不到类的构造函数?
还没被劝退C++的都来看看这个吧构造函数里的异常处理
simple question on C++ initialization listvector的析构问题
C++构造函数的问题[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?
相关话题的讨论汇总
话题: 拷贝话题: 构造函数话题: 复制话题: c++话题: 调用