标签: value-initialization

如何使用Mockito在Spring中模拟自动装配的@Value字段?

我正在使用Spring 3.1.4.RELEASE和Mockito 1.9.5.在我的Spring课程中,我有:

@Value("#{myProps['default.url']}")
private String defaultUrl;

@Value("#{myProps['default.password']}")
private String defaultrPassword;

// ...
Run Code Online (Sandbox Code Playgroud)

从我目前设置的JUnit测试开始,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest 
{ 
Run Code Online (Sandbox Code Playgroud)

我想为我的"defaultUrl"字段模拟一个值.请注意,我不想模拟其他字段的值 - 我想保留它们的原样,只保留"defaultUrl"字段.另请注意,setDefaultUrl我的课程中没有明确的"setter"方法(例如),我不想仅仅为了测试而创建任何方法.

鉴于此,我如何模拟该字段的值?

spring mockito autowired value-initialization

100
推荐指数
7
解决办法
10万
查看次数

内置类型有默认构造函数吗?

看完文章我做了一个点int ()产生0,因为临时int的值进行初始化而不是因为int()呼吁默认构造函数int.(根据我的理解,这篇文章有缺陷.)

我还说原始(内置)类型没有构造函数.原作者让我查看章节$ 10.4.2(TC++ PL)

内置类型也有默认构造函数(6.2.8美元)

但我仍然认为语句"C++允许甚至内置类型(原始类型)具有默认构造函数." 是有缺陷的(根据C++ 03).

我认为TC++ PL中的Bjarne将"构造函数如符号ie ()"与实际的构造函数调用混淆了.当Bjarne写这本书的时候没有引入价值初始化,对吧?那么根据C++ 98和C++ 03,TC++ PL中的文本是不正确的?

你们有什么感想?

编辑

我亲自(通过邮件)问Bjarne关于TC++ PL中有缺陷的文本,这是他的答复

我认为你混淆了"实际的构造函数调用"与概念上有一个构造函数. 内置类型被认为具有构造函数(标准用于描述其行为的任何单词).

c++ constructor value-initialization

43
推荐指数
3
解决办法
2万
查看次数

初始化枚举的值的行为

首先,我想说,根据cppreference.com,对枚举值进行初始化是不可能的.

根据http://en.cppreference.com/w/cpp/language/value_initialization,初始化枚举值实际上执行零初始化.然后,根据http://en.cppreference.com/w/cpp/language/zero_initialization,零初始化枚举的效果是:

如果T是标量类型,则对象的初始值是隐式转换为的整数常量零T.

但是,整数常数零不能隐式转换为枚举.最终,枚举不能进行价值初始化.这听起来很奇怪,并且枚举值的初始值确实适用于VC,GCC和clang.那么,标准对此有何看法?

其次,根据http://en.cppreference.com/w/cpp/language/static_cast:

整数,浮点或枚举类型可以转换为任何完整的枚举类型(结果是未指定的(直到C++ 17)未定义的行为(自C++ 17)如果表达式的值转换为枚举的基础类型,不是目标枚举值之一)

那么,这是否意味着如果目标枚举没有枚举器等于,则初始化枚举值(如果它可以工作)可能实际上导致未定义的行为0

c++ enums initialization language-lawyer value-initialization

33
推荐指数
1
解决办法
7344
查看次数

什么'值初始化'是什么意思?

可能重复:
C++中的以下短语是什么意思:零,默认和值初始化?

如果我有一个班级,例如:

class Info
{
   int x;
   int y;
};
Run Code Online (Sandbox Code Playgroud)

我曾经创建过一个对象,

Info *p = new Info();
Run Code Online (Sandbox Code Playgroud)

Info旁边的括号是否意味着我正在初始化它?它与此Info *p = new Info;有何不同?

我知道有一个问题可以区分新旧C++语言中的不同含义,但我想知道默认值和值初始化之间的语义差异,例如,值初始化是否意味着将某些内容初始化为零?

c++ default-value value-initialization

18
推荐指数
1
解决办法
8501
查看次数

值初始化和非POD类型

一个小时前我在这里发了一个答案,根据我的说法是正确的.然而我的回答却被Martin B贬低了.他说

你很幸运,并且因为我所处的内存恰好是零初始化而得到了零.标准不保证这一点.

然而读迈克尔·伯尔的回答后,这里并尝试下面的示例代码

1)

#include <cassert>

struct B { ~B(); int m; };

int main()
{
   B * b = new B();
   assert(b->m == 0);
}
Run Code Online (Sandbox Code Playgroud)

我在MSVC++ 2010上遇到调试错误.

我有一个类似的错误,当我尝试下面的代码[我的答案在这里 ]在MSVC++ 2010

2)

#include <cassert>
struct Struct {
    std::string String;
    int Int;
    bool k;
    // add add add
};

struct InStruct : Struct
{
   InStruct() : Struct() {}
};

int main()
{
   InStruct i;
   assert(i.k == 0);
}
Run Code Online (Sandbox Code Playgroud)

既没有(1)也没有(2)给gcc/Clang这样的错误让我想到MSVC++ …

c++ initialization visual-c++ value-initialization

17
推荐指数
2
解决办法
4884
查看次数

为什么Foo({})调用Foo(0)而不是Foo()?

由代码中的clang 3.5.0和gcc 4.9.1生成的可执行文件

#include <iostream>

struct Foo
{
   Foo() { std::cout << "Foo()" << std::endl; }
   Foo(int x) { std::cout << "Foo(int = " << x << ")" << std::endl; }
   Foo(int x, int y) { std::cout << "Foo(int = " << x << ", int = " << y << ")" << std::endl; }
};

int main()                 // Output
{                          // ---------------------
   auto a = Foo();         // Foo()
   auto b = Foo(1);        // Foo(int = 1)
   auto c = …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer value-initialization list-initialization c++14

15
推荐指数
1
解决办法
1164
查看次数

将成员添加到现有结构而不破坏遗留代码

我正在使用的一些遗留代码中有以下定义.

struct VlanData
{
    uint16_t mEtherType;
    uint16_t mVlanId;
};
Run Code Online (Sandbox Code Playgroud)

我想在这个结构中添加一个新成员:

struct VlanData
{
    uint16_t mEtherType;
    uint16_t mVlanId;
    uint8_t mVlanPriority; // New member
};
Run Code Online (Sandbox Code Playgroud)

但是,VlanData遗留代码的使用相当不一致.

未在施工时初始化:

VlanData myVlans;
myVlans.mEtherType = 0x8100;
myVlans.mVlanId = 100;
Run Code Online (Sandbox Code Playgroud)

初始值:

VlanData myVlans = { 0x8100, 100 };
Run Code Online (Sandbox Code Playgroud)

我想要做的是提出一种安全的方法来确保遗留代码中的"mVlanPriority"自动设置为0,而无需更新大量代码.

我知道我可以修改遗留代码来对所有成员进行值初始化,如下所示:

VlanData myVlans = {};
Run Code Online (Sandbox Code Playgroud)

但我不想更新所有这些代码.我相信创建这样的默认构造函数会有所帮助:

VlanData()
: mEtherType(0),
  mVlanId(0),
  mVlanPriority(0)
{}
Run Code Online (Sandbox Code Playgroud)

但这也会破坏POD结构的性质.

所以我想我有几个问题:

  1. 有没有一种安全的方法可以确保mVlanPriority遗留代码中的设置为0而不更新遗留代码?
  2. 如果这不再是一个POD类型,那么该类会有什么用处呢?

c++ struct value-initialization

12
推荐指数
1
解决办法
1331
查看次数

为什么这个简单的赋值是未定义的行为?

我清楚了解了我对价值初始化与默认初始化的理解,并且发现了这个:

struct C {
    int x;
    int y;
    C () { }
};

int main () {
    C c = C ();
}
Run Code Online (Sandbox Code Playgroud)

显然这是UB,因为

在C()的情况下,有一个能够初始化x和y成员的构造函数,因此不会进行初始化.因此,尝试将C()复制到c会导致未定义的行为.

我想我理解为什么,但我不确定.有人可以详细说明吗?

这是否意味着这也是UB?

int x; x = x;
Run Code Online (Sandbox Code Playgroud)

顺便提一下,关于值初始化,以下是否保证为零?

int x = int ();
Run Code Online (Sandbox Code Playgroud)

c++ undefined-behavior value-initialization

12
推荐指数
1
解决办法
348
查看次数

值初始化是C++ 98标准的一部分吗?如果没有,为什么它被添加到C++ 03标准中?

干杯和hth.- Alf在这个答案中发表评论说,与C++ 98相比,值初始化可以说是C++ 03的一个新特性.我想知道他的意思.

值初始化的C++ 98的一部分?它是出现在概念中而不是名义上吗?为什么它被添加到C++ 03标准中?

我有'03标准的副本,但不是'98标准.这是默认初始化和值初始化的定义.

默认初始化T类型的对象意味着:

- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

- 如果T是数组类型,则每个元素都是默认初始化的;

- 否则,对象被零初始化.

对值类型T的对象进行值初始化意味着:

- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;

- 如果T是数组类型,则每个元素都是值初始化的;

- 否则,对象被零初始化

我的猜测是'98有默认初始化但不是值初始化,并且两者之间存在一些关键差异.说实话,我在解析这里的标准时遇到了麻烦,我不明白这些定义之间的区别.

c++ language-lawyer value-initialization c++03 c++98

12
推荐指数
1
解决办法
1549
查看次数

默认初始化和值初始化之间的歧义

我发现许多文章解释了“默认初始化和值初始化”之间的区别,但实际上我并不清楚。

这是一个例子:

class A{
   public:
      int x;
};


int main(){
    A a;// default initialization so x has undefined value.
    A b = A(); // value initialization so x is a scalar thus it is value initialized to 0

}
Run Code Online (Sandbox Code Playgroud)

我猜上面在上面可以,但是在这里:

int value = 4; // is this considered a value-initialization?
Run Code Online (Sandbox Code Playgroud)

请帮助我了解两种初始化形式之间的主要区别。

c++ initialization value-initialization default-initialization

12
推荐指数
1
解决办法
83
查看次数