我有一个数学矢量类,其设计如下:
class Vector3D {
public:
float x;
float y;
float z;
public:
Vector3D() {}
Vector3D(float xx, float yy, float zz = 0.0) { x=xx; y=yy; z=zz; }
Vector3D(const float v[]) { x=v[0]; y=v[1]; z=v[2]; }
Vector3D(const Vector3D& v) { x=v.x; y=v.y; z=v.z; }
// math member methods
// ...
};
Run Code Online (Sandbox Code Playgroud)
我曾经使用以下方法在堆栈上创建一个Vector3D类型的变量:
Vector3D vec1 = Vector3D(1.0, 1.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
我听说可以通过实现初始化列表构造函数来缩短C++ 0x,因此可以编写如下内容:
Vector3D vec1 = { 1.0, 1.0, 1.0 };
Run Code Online (Sandbox Code Playgroud)
实现这个的正确方法是什么?
花括号的语法真的很适合这个类!感谢您的回答和评论!
此外,我做了一些综合性能测试,试图测量构造函数初始化列表是否在构造函数中提供了成员变量赋值的加速.以下是我用g ++ 4.6.1得到的结果:
原样(构造函数和自定义复制构造函数中的成员赋值):
Median: 634860 ns
Median, CPI: 15.8715 …Run Code Online (Sandbox Code Playgroud)gcc应该警告成员变量的初始化顺序a和bC类吗?基本上,对象b被初始化,并且在对象A之前调用它的构造函数.这意味着b使用未初始化的a.
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
A() : x(10) { cout << __func__ << endl; }
friend class B;
};
class B
{
public:
B(const A& a) { cout << "B: a.x = " << a.x << endl; }
};
class C
{
private:
//Note that because b is declared before a it is initialized before a
//which means b's constructor is executed before a. …Run Code Online (Sandbox Code Playgroud) 如果我这样做:
MyClass a=b;
Run Code Online (Sandbox Code Playgroud)
这使用复制构造函数进行初始化a,并且=不涉及运算符重载,对吧?
该=如果操作者将被用于a在已初始化,然后我后来它分配给别的东西.
我看到了这个:
S(std::initializer_list<T> l) : v(l) {
Run Code Online (Sandbox Code Playgroud)
使用如下:
S<int> s = {1, 2, 3, 4, 5}; // direct list-initialization
Run Code Online (Sandbox Code Playgroud)
这是有趣的.它是初始化并且它使用=运算符,但它调用的是不是复制构造函数的构造函数.为什么不采用这样的语法:
S<int> s {1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)
这就是std::vector 构造函数的std::initializer_list工作方式.=当操作符不调用复制构造时,使用运算符初始化对象似乎很困惑,不是吗?
尝试编译一个存储“参与者”的简单链表时,我遇到了一个非常奇怪的错误。但是我清楚地给了它正确的数据,这可以得到确认,因为它在不使用初始化列表时有效(执行赋值运算符“=”)。
下面是相关的代码块:
struct Participant
{
unsigned startNumber;
std::string forename;
std::string surname;
std::string club;
float finishTime;
};
struct ListNode
{
ListNode* next;
Participant data;
};
Participant tempData {list->data}; //error occurs here.
Run Code Online (Sandbox Code Playgroud)
以下是我得到的错误:
List.cpp:15:36: error: cannot convert ‘Participant’ to ‘unsigned int’ in initialization
Run Code Online (Sandbox Code Playgroud)
更换:
Participant tempData {list->data};
Run Code Online (Sandbox Code Playgroud)
和:
Participant tempData = list->data;
Run Code Online (Sandbox Code Playgroud)
编译并顺利运行。
g++ (Debian 4.7.2-5) 4.7.2
CrunchBang (Debian 7 'Wheezy')
Run Code Online (Sandbox Code Playgroud)
关于问题出在哪里的任何想法?任何帮助是极大的赞赏!
最好的问候,埃里克·詹森
为什么我不能使用"initializer_list"作为"普通"变量分配变量?
码:
void stovr(int a){}
int main() {
auto v {5}; // v is std::initializer_list<int>
stovr(v); // cannot convert 'std::initializer_list<int>' to 'int'
}
Run Code Online (Sandbox Code Playgroud)
v是列表)))v是list和不是int?因此,我想练习使用智能指针的技能。我创建了具有以下构造函数的类(单链列表)模板:
template <class Type>
class list
{
//...
public:
list( std::initializer_list < Type > initlist ) { ... }
//...
};
Run Code Online (Sandbox Code Playgroud)
在主函数中,我想构造初始化器列表并将其作为一件事传递给类构造器(类似这样,我认为这是可能的,但我不知道该怎么做):
typedef int Type;
int main ()
{
//...
size_t count; // to know How many elements initlist will have
std :: initializer_list < Type > initlist;
cout << "Enter, please, count of elements and their values\n";
cin >> count;
Type temp_data;
for (size_t i = 0; i < count; i++)
{
cin >> temp_data; //user input data and …Run Code Online (Sandbox Code Playgroud) 我有一个类有点像:
class Object {
public:
struct Flag {
const uint32_t bit = 0;
const wchar_t* name = L"";
const wchar_t sign = L"";
}
static std::map<const char*, Flag> Flags;
}
Run Code Online (Sandbox Code Playgroud)
我目前在VS2015,但想支持clang和gcc(最新的).我的问题是,我无法弄清楚如何用数据实际初始化该地图.
我尝试将其内联,例如:
static std::map<const char*, Flag> Flags = {
{ "FOO1", { 0, L"FOO1", L'A' } },
{ "FOO2", { 1, L"FOO3", L'B' } },
{ "FOO3", { 2, L"FOO3", L'C' } }
}
Run Code Online (Sandbox Code Playgroud)
但是抱怨说只有const整数类型可以在课堂上.好的!所以我只是将它作为类定义中的声明(如第一个代码片段所示),并将其放在关联的cpp中:
static std::map<const char*, Object::Flag> Object::Flags = {
{ "FOO1", { 0, L"FOO1", L'A' } }, …Run Code Online (Sandbox Code Playgroud) 我需要一些关于如何使用 Main 方法中的一些示例值初始化以下对象以执行某些操作的帮助。
由于我是 C# 新手,请指导我从哪里可以获得此信息
class MobOwner
{
public string Name { get; set; }
public List<string> Mobiles { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 是什么阻止了这个初始化工作?
#include <map>
using std::map; using std::pair; using std::make_pair;
struct P {
char a_, b_;
P(char a, char b) : a_{a}, b_{b} {}
operator pair<char,char>() { return make_pair(a_, b_); }
};
int main() {
map<char,char> qmap { P( 'a','b' ) };
}
Run Code Online (Sandbox Code Playgroud)
看起来转换运算符 inP不能隐式应用在花括号初始化列表中?或者是别的什么?
我正在包装表单的C++ fn
foo(input, std::initializer_list<Option> options);
Run Code Online (Sandbox Code Playgroud)
我需要从另一种格式的数据构建一个选项列表,并将它们传递给foo.我无法看到以std::initializer_list 编程方式构建的方法- 这是对的吗?(如果一个人被迫使用更标准的容器,那将是有意义的,但我想在重新分解之前进行检查.)