constructor相关内容
在以下代码中: class A { public: int X; A(int x):x(x){} }; class B:public virtual A { public: B(int x):A(x){} }; class C:public virtual A { public: C(int x):A(x){} }; class D:pub
..
我不明白为什么你不能编译一个类,它有一个成员(不是默认可构造)与一个大括号初始值设定器和一个继承的构造函数。 g ++说: test.cpp:22:15:error:使用已删除的函数'Derived :: Derived > 派生d(1.2f); test.cpp:16:13:note:'Derived :: Derived(float)'被隐式删除 ,因为默认定义是错误:
..
我有一个没有构造函数的抽象C ++类。它应该是一个基类,所以其他类可以继承它。我想做的是在基类中声明一个常量变量,并在每个派生类的构造函数中初始化它,但在每个类中没有其他地方。在C ++中是合法的吗?如果是,我该怎么办呢? 解决方案 在C ++中是否合法? 否。 解决方案是在你的基类中提供一个合适的构造函数 - 否则不能用过的。此外,没有理由不提供该构造函数。 cl
..
C ++标准说,禁止从构造函数或析构函数调用纯虚函数。这是什么原因?为什么标准应该这样限制? 解决方案 当一个类析构函数运行时,所有子类析构函数都有已经运行。调用由子类定义的虚方法是无效的,它的析构函数已经运行了。 在构造函数中调用虚方法时存在类似的限制。您不能为其构造函数尚未运行的子类调用虚拟方法。
..
如果一个对象在构造函数中抛出异常,基类的析构函数是否会被调用? 解决方案 在构造期间抛出,所有先前构造的子对象将被适当地销毁。以下程序证明基础肯定被销毁: struct Base { 〜Base { std :: cout
..
我已经试过提出这个问题,但我不够清楚。所以这里是一个多尝试。对我的英语很抱歉) 让我们看看代码: #include #include using namespace std; struct A { unique_ptr ref; void printRef(){ if(ref.get()) cout
..
我试图理解默认构造函数(由编译器提供,如果你不写一个)与你自己的默认构造函数。这个简单的类: class A { private: int x; public: A(){std :: cout x = x; } };
..
我知道当我定义一个空类并且根本不提供声明时,编译器将提供默认和拷贝构造函数,析构函数和拷贝赋值运算符的定义。 这些规则是什么?编译器不是提供一个(例如)复制构造函数?移动构造函数和移动赋值运算符呢? (例如:如果我的类有一个引用成员 解决方案 :在C ++ 11中,它比隐式声明或更复杂。它们可以是隐式声明和默认,隐式声明和删除,或未声明。请阅读此以区分后者2.以下信息不完全正确
..
为什么从A类的构造函数抛出的以下异常被捕获两次,首先是在构造函数内部的catch,第二次是在main函数中的catch? 为什么它不会被构造函数中的catch捕获一次? #include using namespace std; class E { public: const char * error; E(const char * arg)
..
可能重复: 考虑下面的示例程序: #include
..
说我有一个像这样的结构(POD): struct Foo { int i; double d; }; 以下两行之间有什么区别: Foo * f1 = new Foo; Foo * f2 = new Foo(); 解决方案 第一个保留值未初始化;第二个将它们初始化为零。这只适用于没有构造函数的POD类型。
..
我试图阻止访问我写的类的默认构造函数。我想让别人使用的构造函数需要一个const引用另一个对象。我已经使默认构造函数私有,以防止其他人使用它。我得到一个编译器错误的默认构造函数,因为const引用成员变量未正确初始化。我可以做什么来做这个编译? class CFoo { public: CFoo(); 〜CFoo(); }; class CBar { public
..
在以下代码中: struct Foo { Foo(int x = 0) ; }; 构造函数计数为默认构造函数? 解决方案 C ++ 98§12.1/ 5 (强调我): 类X的默认构造函数是可以在没有参数的情况下调用的构造函数。如果没有用户声明的类X的构造函数,则默认构造函数被隐式声明。 所以是的,它算作默认构造函数。 另
..
例如,我想声明一个类,但我想客户端不能使用复制构造函数(或复制赋值运算符) 以下两个不允许使用复制构造函数: 1。 class Track { public: Track(){}; 〜Track(){}; private: Track(const Track&){}; }; 2。 class Track { public
..
有没有办法在未命名类中声明构造函数或析构函数?请考虑以下 void f() { struct { // } inst1,inst2; // f实现 - 实例的使用 } 后续问题:实例被构造(并销毁)为任何基于堆栈的对象。什么叫?它是一个由编译器自动分配的名称吗? 解决方案 不能为未命名类声明构造函数或析构函数,因为构造函数和析构函数名称需要匹配类
..
假设我正在写一个拥有 T 值的类模板 C ,所以 T 是可复制的时,才可以复制c $ c> C 。通常,当模板可能支持或可能不支持某个操作时,您只需定义该操作,并由调用方来避免在不安全的情况下调用它: template class C { private: T t; public: C(const C& rhs); C(C&& rhs
..
我有一个构造函数尝试初始化基类中的字段。编译器抱怨。该字段受保护,因此派生类应该具有访问权。 //基类: class BaseClass { public: BaseClass(std :: string); BaseClass(const BaseClass& orig); virtual〜BaseClass(); const std :: st
..
标准似乎提供了两个规则,用于区分涉及用户定义的转换运算符的隐式转换序列: c ++ 11 13.3.3最佳可行函数[over.match.best] [...]是一个比另一个可行函数更好的函数 F2 if [...] 定义的转换(见8.5,13.3.1.5和13.3.1.6)和从返回类型F1到目标类型(即正在初始化的 实体的类型)的 标准转换序列是比标准转换序列更好的
..
N3797 :: 9.5 / 2 [class.union] 说: 如果联合的任何非静态数据成员具有非平凡默认 构造函数(12.1),复制构造函数(12.8),移动构造函数(12.8), 赋值运算符(12.8),移动赋值运算符(12.8)或 析构函数(12.4),联合的相应成员函数 必须是用户提供的或者将被隐式删除(8.4.3)对于 联合 我试图通过示例理解该笔记:
..
考虑一个需要制作副本的类。副本中的绝大多数数据元素必须严格反映原始数据元素,然而,有几个元素的状态不被保留并需要重新初始化。 从复制构造函数调用默认赋值运算符是不好的形式吗? 默认赋值运算符在普通数据,double,char,short)以及每个赋值运算符的用户定义类。指针需要单独处理。 一个缺点是,由于不执行额外的重新初始化,此方法会导致赋值操作符crippled。也不可能禁用
..