我最近注意到C++ 0x中的一个类需要一个显式的默认构造函数.但是,我没有想出一个可以隐式调用默认构造函数的场景.这似乎是一个相当无意义的说明者.我想也许它会Class c;不赞成,Class c = Class();但似乎并非如此.
来自C++ 0x FCD的一些相关引用,因为我更容易导航[类似文本存在于C++ 03中,如果不在同一个地方]
12.3.1.3 [class.conv.ctor]
默认构造函数可以是显式构造函数; 这样的构造函数将用于执行默认初始化或值初始化(8.5).
它继续提供显式默认构造函数的示例,但它只是模仿我上面提供的示例.
8.5.6 [decl.init]
默认初始化T类型的对象意味着:
- 如果T是一个(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
8.5.7 [decl.init]
对值类型T的对象进行值初始化意味着:
- 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
在这两种情况下,标准都要求调用默认构造函数.但是如果默认构造函数是非显式的,那就会发生这种情况.为了完整起见:
8.5.11 [decl.init]
如果没有为对象指定初始化程序,则默认初始化该对象;
据我所知,这只是从没有数据的转换.这没有意义.我能想到的最好的是以下内容:
void function(Class c);
int main() {
function(); //implicitly convert from no parameter to a single parameter
}
Run Code Online (Sandbox Code Playgroud)
但显然这不是C++处理默认参数的方式.还有什么会使explicit Class();行为与众不同Class();?
生成此问题的具体示例是std::function[20.8.14.2 func.wrap.func].它需要几个转换构造函数,其中没有一个被标记为显式,但默认构造函数是.
我有一个没有默认构造函数的类.我需要一种方法来获得这个类的"空白"实例.'blank'表示在实例化之后,所有类字段都应该具有默认值,如null,0等.
我问,因为我需要能够序列化/绝望化大对象树.并且我无法访问此对象类的源,并且类既没有默认构造函数也没有实现可序列化.尝试序列化这样的结构可能不是一个好主意,但另一种方法是将其转换为更容易序列化的东西.
java reflection serialization constructor default-constructor
有没有办法指定一个默认的构造函数enum class?
我使用an enum class来指定一组允许库中特定数据类型的值:在这种情况下,它是Raspberry Pi的GPIO引脚ID号.它看起来像这样:
enum class PinID : int {N4 = 4, N17 = 17, /* ...etc... */ }
我这样做而不仅仅是使用一个int是确保代码是安全的:我可以static_assert(或者编译时确保 - 实际使用的方法对我来说并不重要)像有人没有这样的东西发出拼写错误(传递5而不是4等),我得到类型不匹配的自动错误消息等.
那么问题就是enum class有一个默认的构造函数 - 为了兼容性而enum我假设(因为它们具有相同的行为) - 初始化为enum class等效的0.在这种情况下,没有0价值.这意味着用户做出如下声明/定义:
PinID pid = PinID();
正在获取一个未明确定义的枚举器(当查看代码时甚至看起来"不存在"),并且可能导致运行时错误.这也意味着switch如果没有错误/默认情况,我就不可能使用明确定义的枚举器的值这样的技术- 这是我想要避免的,因为它会强迫我执行throw或执行类似返回a的操作boost::optional,这些操作不太适合静态分析.
我试图定义默认构造函数无济于事.我(拼命)试图定义一个共享名称的函数enum class,但这(不出所料)导致奇怪的编译器错误.我想保留铸的能力enum class到int,与所有N#统计员映射到它们各自的#,所以仅仅是"定义",比方说,N4 = 0是不可接受的; 这是为了简单和理智.
我想我的问题是双重的:有没有办法获得我使用后的静态安全性enum class?如果没有,还有什么其他可能性?我想要的是: …
它在未定义构造函数时工作正常,但如果我定义参数化构造函数而不是默认构造函数并且在创建对象时不传递任何值,则会出错.我认为构造函数是预定义的.
如果我已经定义了参数化构造函数,为什么还需要定义默认构造函数?是不是预定义的默认构造函数?
该标准的 C++的书说,对于类类型成员的默认构造函数被隐式生成默认构造函数调用,但内建类型不被初始化.但是,在此测试程序中,当在堆中分配对象或使用临时对象时,我得到意外的结果:
#include<iostream>
struct Container
{
int n;
};
int main()
{
Container c;
std::cout << "[STACK] Num: " << c.n << std::endl;
Container *pc = new Container();
std::cout << "[HEAP] Num: " << pc->n << std::endl;
delete pc;
Container tc = Container();
std::cout << "[TEMP] Num: " << tc.n << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
[STACK] Num: -1079504552
[HEAP] Num: 0
[TEMP] Num: 0
Run Code Online (Sandbox Code Playgroud)
这是一些编译器特定的行为吗?我真的不打算依赖它,但我很想知道为什么会这样,特别是第三种情况.
c++ constructor initialization default-constructor object-initialization
这应该是一个微不足道的问题,但我无法在stackoverflow上明确找到它.
如果用户不提供,将隐式定义以下内容.
但是我已经读过某个地方(我现在似乎无法找到),有些情况下编译器不会隐式实现它们.
这些条件是什么?
如何编写自己的数组类,不需要为其元素提供默认构造函数?现在,当我执行new []来分配空间时,我需要一个默认的构造函数.
std :: vector没有.
他们如何做到这一点?
如果我使用私有默认构造函数和具有参数的公共构造函数定义类,如何访问私有构造函数?
public class Bob
{
public String Surname { get; set; }
private Bob()
{ }
public Bob(string surname)
{
Surname = surname;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过类上的静态方法访问私有构造函数,如下所示:
public static Bob GetBob()
{
return new Bob();
}
Run Code Online (Sandbox Code Playgroud)
我认为我可以通过扩展方法访问私有构造函数,因为(根据我的理解)扩展方法被翻译,以便它们看起来是类上的静态方法,但我不能:
static class Fred
{
public static Bob Bobby(this Bob bob)
{
return new Bob();
}
}
Run Code Online (Sandbox Code Playgroud)
那么,我如何访问私有构造函数?
谢谢
我想这样做的原因是我想为我们的某个业务类创建测试,但不允许此类的使用者能够错误地实例化对象.我正在测试它,所以我知道(我希望!)在什么情况下测试会失败.我现在还在测试n00b,所以我的想法可能是也可能不是做事的"错误方式".
我已经改变了我的测试策略,就像这个类的消费者那样做事,即调用公共方法,如果公共方法没问题,假设私有方法没问题.我仍倾向于测试私有方法,但我的老板是呼吸了我的脖子上交付:-(
我不想为我的auditRecord类创建默认构造函数.
但是Spring似乎坚持这样做:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'auditRecord' defined in ServletContext resource
[/WEB-INF/applicationContext.xml]:
Instantiation of bean failed;
nested exception is org.springframework.beans.BeanInstantiationException:
Could not instantiate bean class [com.bartholem.AuditRecord]:
No default constructor found;
nested exception is
java.security.PrivilegedActionException:
java.lang.NoSuchMethodException:
com.bartholem.AuditRecord
Run Code Online (Sandbox Code Playgroud)
这真的有必要吗?
我有以下2个班级
public class classA {
classA() {
System.out.println("A");
}
}
class classB extends classA {
classB() {
System.out.println("B");
}
}
Run Code Online (Sandbox Code Playgroud)
然后跑
classA c = new classB();
Run Code Online (Sandbox Code Playgroud)
要么
classB c = new classB();
Run Code Online (Sandbox Code Playgroud)
总是给
A
B
Run Code Online (Sandbox Code Playgroud)
为什么会这样?乍一看,在任何一种情况下,我都会假设只classB调用构造函数,因此唯一的输出就是
B
Run Code Online (Sandbox Code Playgroud)
但这显然是错误的.
c++ ×5
constructor ×4
java ×4
c# ×1
c++11 ×1
enum-class ×1
explicit ×1
implicits ×1
inheritance ×1
reflection ×1
spring ×1
spring-mvc ×1
superclass ×1
vector ×1
visibility ×1