我正在使用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"方法(例如),我不想仅仅为了测试而创建任何方法.
鉴于此,我如何模拟该字段的值?
看完这文章我做了一个点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中有缺陷的文本,这是他的答复
我认为你混淆了"实际的构造函数调用"与概念上有一个构造函数. 内置类型被认为具有构造函数(标准用于描述其行为的任何单词).
首先,我想说,根据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
如果我有一个班级,例如:
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++语言中的不同含义,但我想知道默认值和值初始化之间的语义差异,例如,值初始化是否意味着将某些内容初始化为零?
一个小时前我在这里发了一个答案,根据我的说法是正确的.然而我的回答却被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++ …
由代码中的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
我正在使用的一些遗留代码中有以下定义.
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结构的性质.
所以我想我有几个问题:
mVlanPriority遗留代码中的设置为0而不更新遗留代码? POD类型,那么该类会有什么用处呢?我清楚了解了我对价值初始化与默认初始化的理解,并且发现了这个:
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) 干杯和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有默认初始化但不是值初始化,并且两者之间存在一些关键差异.说实话,我在解析这里的标准时遇到了麻烦,我不明白这些定义之间的区别.
我发现许多文章解释了“默认初始化和值初始化”之间的区别,但实际上我并不清楚。
这是一个例子:
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