我发现可以使用与下面示例中显示的名称相同的构造函数参数初始化成员变量.
#include <cstdio>
#include <vector>
class Blah {
std::vector<int> vec;
public:
Blah(std::vector<int> vec): vec(vec)
{}
void printVec() {
for(unsigned int i=0; i<vec.size(); i++)
printf("%i ", vec.at(i));
printf("\n");
}
};
int main() {
std::vector<int> myVector(3);
myVector.at(0) = 1;
myVector.at(1) = 2;
myVector.at(2) = 3;
Blah blah(myVector);
blah.printVec();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
带有参数的g ++ 4.4 -Wall -Wextra -pedantic没有提供任何警告并且工作正常.它也适用于clang ++.我想知道C++标准对此有何看法?是否合法并保证始终有效?
可以在初始化数据成员之前初始化指向该数据成员的指针吗?换句话说,这是有效的C ++吗?
#include <string>
class Klass {
public:
Klass()
: ptr_str{&str}
, str{}
{}
private:
std::string *ptr_str;
std::string str;
};
Run Code Online (Sandbox Code Playgroud)
这个问题与我的相似,但顺序在那里正确,答案说
我建议不要像这样编码,以防有人更改您班上成员的顺序。
这似乎意味着撤销顺序是非法的,但是我不确定。
我想创建一个与某个父子关系中的另一个类相关联的类.为此,"child"类需要引用它的父级.
例如:
template <typename T>
class TEvent {
private: T* Owner;
public: TEvent(T* parent) : Owner(parent) {}
};
class Foo {
private: TEvent<Foo> Froozle; // see below
};
Run Code Online (Sandbox Code Playgroud)
现在的问题是我不能Froozle直接初始化实例,也不能使用Foo构造函数的实例化列表,因为this那里不允许引用.除了添加另一个方法setParent(T*)(我不太喜欢,因为这意味着我必须让TEvent<>实例处于无效状态),有没有办法实现这一点?