Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >何时在C++中生成默认构造函数?

何时在C++中生成默认构造函数?
EN

Stack Overflow用户
提问于 2012-06-01 09:41:24
回答 3查看 2.8K关注 0票数 1

根据"Inside C++对象模型“,编译器只在以下四种条件中的任何一种为真时才生成副本构造函数(如果不是程序员声明的话):

类包含存在副本构造函数的类的成员对象时(类设计器显式声明(如前一个字符串类,或由编译器合成,如类Word),当类派生自存在副本构造函数的基类时(再次声明或synthesized)

  • When类声明一个或多个虚拟函数

  • ,当类派生自一个或多个基类为虚拟

的继承链时)。

这意味着如果我有一个只有构造函数的类,那么编译器就不会提供复制构造函数。

让我们举一个例子:

代码语言:javascript
运行
AI代码解释
复制
class test
{
    test(){}
};
int main()
{
    test obj1;       //statement 1
    test obj2(obj1); //statement 2
}

以上代码工作正常。现在,当我在类测试中添加以下行时,问题就出现了:

代码语言:javascript
运行
AI代码解释
复制
test(const test& rhs) = delete;

"=删除“确保不自动提供复制构造函数。在添加了上面的行后,我得到了语句2的一个错误,即Use of deleted function test::test(const test&)

我的问题是:按照"Inside C++对象模型“,我不需要上述类的复制构造函数,所以当我明确地说不生成副本构造函数(使用删除)时,为什么会出现错误?因为我期望编译器不需要上述类的复制构造函数。

我正在使用gcc版本4.6.3。

EN

回答 3

Stack Overflow用户

发布于 2012-06-01 09:47:46

要使类可以复制,它需要有一个复制构造函数。无论您是自己编写,还是编译器为您生成一个,这都无关紧要-- test a; test b(a);必须可用才能成为有效的操作。

您显式地强制编译器删除复制构造函数--这是旧的“让复制构造函数私有”的新版本。它不允许复制。所以不要为你不能复制而感到惊讶。因为你告诉编译器不要允许它。

票数 8
EN

Stack Overflow用户

发布于 2012-06-01 09:48:08

隐式生成的复制构造函数的标准单词是class.copy/7

如果类定义没有显式声明副本构造函数,则将隐式声明一个副本构造函数。如果类定义声明了一个移动构造函数或移动赋值操作符,则隐式声明的复制构造函数被定义为已删除;否则,它被定义为defaulted (8.4)。如果类具有用户声明的复制赋值操作符或用户声明的析构函数,则不建议使用后一种情况。

和类。拷贝/13

默认且未定义为已删除的复制/移动构造函数,如果它被odr使用(3.2),或者在其第一次声明后显式默认时,它将被隐式定义。注意:即使实现省略了odr-使用(3.2,12.2),复制/移动构造函数也是隐式定义的。-end注意,如果隐式定义的构造函数满足constexpr构造函数(7.1.5)的要求,则隐式定义的构造函数是constexpr。

因此,仍然会为test生成一个复制构造函数,并由语句2调用它。我相信,“C++对象模型内部”指的是复制构造函数并不简单。

票数 2
EN

Stack Overflow用户

发布于 2012-06-01 09:47:36

这一行:

代码语言:javascript
运行
AI代码解释
复制
test obj2(obj1)

正在尝试调用复制构造函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10854948

复制
相关文章
jquery调用javascript方法
本来想找个“优雅”一点的方法,类似C#在调用C++方法时候的Invoke之类的。没找到,后来想想,其实也没必要,直接写就好了,算最优雅了吧。只是少了VS的Intelligence,有点不习惯罢了。
_淡定_
2018/08/24
1.7K0
JavaScript 函数调用
在 HTML 中默认的全局对象是 HTML 页面本身,所以函数是属于 HTML 页面。
陈不成i
2021/07/19
2.2K0
基类派生类多态虚函数?
通常在层次关系的根部有一个基类,其他类则直接或间接的从基类继承而来,这些继承得到的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。
洁洁
2023/10/10
2120
JavaScript类库---JQuery(二)
   一个基础底层函数:jQuery.ajax();  //高级工具函数都会调用此函数;
JQ实验室
2022/02/09
1.3K0
JavaScript类库---JQuery(二)
JavaScript类库---JQuery(一)
Jquery类库定义了一个全局函数:JQuery(); 别名$.是JQuery在全局命名空间中定义的唯一两个变量。返回一个新创建的JQuery对象;
JQ实验室
2022/02/09
4.3K0
JavaScript类库---JQuery(一)
Python 运行JavaScript 调用JavaScript函数
我们在进行python爬虫爬取一些站点时,有时会用到js逆向的操作,这时候就需要python运行javascript来进行操作
Chuanrui 初见之旅
2022/11/14
1.1K0
c++继承 基类 派生类 虚函数
类和类的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父类中的一些东西,父类也称为基类,子类也称为派生类。派生类继承了基类除构造函数以外的所有成员。
用户7886150
2021/02/03
1.1K0
JavaScript——函数定义和调用
定义函数时,函数如果有参数,参数放到小括号里面,函数如果有返回值,返回值通过 return 关键字来返回
落雨
2022/04/07
29.7K0
JavaScript函数和类
函数参数传递时,如果是传值则是传形参。如果是传对象,则是传引用(函数内部对对象的改变对外部是可见的)。
职场亮哥
2020/10/10
9040
匿名函数调用方法_javascript匿名函数
没错,匿名函数简单来说就是普通函数去掉名字,但是他不能单独定义与使用,下面是匿名函数的一些使用场景:
全栈程序员站长
2022/11/14
1.5K0
jquery跨js文件调用函数示例
1 var common_func; (function() { 2 common_func = { 3 load_hot_data: function(AreaCode)
指尖改变世界
2019/10/21
5.3K0
前端进阶: 如何用javascript存储函数?
可视化搭建平台的设计思路往往也是基于上面的过程展开的, 我们需要提供编辑器环境给用户来创建视图和交互, 最终用户保存的产物可能是这样的:
徐小夕
2021/12/04
1.7K0
前端进阶: 如何用javascript存储函数?
onkeyup事件调用JavaScript sendRequest()函数
使用validationMessage div来显示相应于这个输入域Catalog Id的一个校验消息。onkeyup事件调用一个JavaScript sendRequest()函数。这个sendRequest()函数创建一个XMLHttpRequest对象。创建一个XMLHttpRequest对象的过程因浏览器实现的不同而有所区别。如果浏览器支持XMLHttpRequest对象作为一个窗口属性(所有普通的浏览器都是这样的,除了IE 5和IE 6之外),那么,代码可以调用XMLHttpRequest的构造器。如果浏览器把XMLHttpRequest对象实现为一个ActiveXObject对象(就象在IE 5和IE 6中一样),那么,代码可以使用ActiveXObject的构造器。下面的函数将调用一个init()函数,它负责检查并决定要使用的适当的创建方法-在创建和返回对象之前。
用户7718188
2021/10/08
1.1K0
JQuery javascript实现父子页面相互调用
如上图,在iframe子页面的<script>元素中,定义了taskStatus全局变量,如果希望在其父页面中获取该全局变量的值,则可在父页面的<script>元素中新增js脚本如下:
授客
2019/08/21
2K0
JQuery javascript实现父子页面相互调用
基类View
在 Class-based views 源码解析 #1 中我们从宏观层面讨论了 Django 类视图的类继承结构以及命名规律。接下来我们要深入各个具体的类视图,探索其具体的代码实现。本节将分析 base.py 中最重要的的一个类,它也是所有类视图的基类 View 。 之前我们说过,尽管类视图看上去类的种类繁多,但每个类都是各司其职的,且从类的命名就可以很容易地看出这个类的功能。大致可分为如下三个大的功能块,分别由三个类提供对应的方法: 处理 HTTP 请求。根据 HTTP 请求方法的不同做出相应处理。例如同
追梦人物
2018/04/17
9210
【说站】javascript new调用构造函数
以上就是JavaScript new调用构造函数的方法,希望对大家有所帮助。更多Javascript学习指路:Javascript
很酷的站长
2022/11/24
7850
【说站】javascript new调用构造函数
JavaScript重构技巧 — 函数和类
JavaScript 是一种易于学习的编程语言,编写运行并执行某些操作的程序很容易。然而,要编写一段干净的JavaScript 代码是很困难的。
前端小智@大迁世界
2020/06/19
7230
Golang语言--子类调用父类函数
例子:
李海彬
2018/03/21
2.2K0
Golang语言--子类调用父类函数
JavaScript和jQuery添加和删除class类名
element.classList.remove("className") :删除类名
德顺
2019/11/13
2.8K0
基类和派生类
  在面向对象设计中,被定义为包含所有实体共性的class类型,被称为“基类”。-百度百科
全栈程序员站长
2022/09/20
1K0

相似问题

javascript:调用基类函数

32

Javascript调用基类构造函数

12

在JavaScript中调用基类函数-类继承

30

调用基类函数

41

调用基类函数

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档