假设我有私人承包商,客人一类ptr,name,pname,rname,crname和age.如果我自己不初始化会怎么样?这是一个例子:
class Example {
private:
int *ptr;
string name;
string *pname;
string &rname;
const string &crname;
int age;
public:
Example() {}
};
Run Code Online (Sandbox Code Playgroud)
然后我做:
int main() {
Example ex;
}
Run Code Online (Sandbox Code Playgroud)
如何在ex中初始化成员?指针会发生什么?做string和int获得0 intialized默认构造函数string()和int()?参考会员怎么样?const引用怎么样?
我还应该知道什么?
有谁知道涵盖这些案例的教程?也许在一些书中?我可以在大学的图书馆访问很多C++书籍.
我想学习它,所以我可以编写更好的(无bug)程序.任何反馈都会有帮助!
考虑以下代码,我们在其中D基于另一部分初始化部分D:
struct c {
c() : D{rand(), D[0]} {}
int D[2];
};
int main() {
c C;
assert(C.D[0] == C.D[1]);
}
Run Code Online (Sandbox Code Playgroud)
以上程序定义明确吗?我们可以安全地使用同一阵列的一部分来初始化它的另一部分吗?
class A {
int x;
static int i;
};
int x = 10;
int A::i = x;
Run Code Online (Sandbox Code Playgroud)
当我编译上面的代码时,出现错误
<source>:8:12: error: invalid use of non-static data member 'A::x'
8 | int A::i = x;
| ^
<source>:2:9: note: declared here
2 | int x;
| ^
Run Code Online (Sandbox Code Playgroud)
是什么导致了这个错误?
#include <cassert>
#include <cmath>
int main()
{
struct point_of_cone
{
double x, y;
double z = [&] { using std::sqrt; return sqrt(x * x + y * y); }();
};
point_of_cone p = {3.0, 4.0};
assert(p.z == 5.0);
}
Run Code Online (Sandbox Code Playgroud)
适用于clang++来自中继的工作正常,但是g++从中继失败并出现错误消息(链接):
错误:没有为此lambda函数捕获'this'
point_of_conein namespace范围的定义适用于两者.
使用[this]lambda捕获进行略微修改的定义也适用于全局或局部范围.
哪个编译器是对的?
我遇到了一个名为"member initializer"的奇怪概念.
这里说:
C++ 11添加了成员初始化器,如果构造函数没有初始化成员本身,则表达式将应用于类范围内的成员.
它的定义是什么?
是否有一些例子来说明它的用法?
我确信这是一个非常简单的问题.以下代码显示了我正在尝试执行的操作:
class MemberClass {
public:
MemberClass(int abc){ }
};
class MyClass {
public:
MemberClass m_class;
MyClass(int xyz) {
if(xyz == 42)
m_class = MemberClass(12);
else
m_class = MemberClass(32);
}
};
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为m_class正在使用空构造函数(不存在)创建.这样做的正确方法是什么?我的猜测是使用指针和实例化m_class使用new,但我希望有一种更简单的方法.
编辑:我之前应该说过,但我的实际问题有一个额外的复杂性:我需要在初始化m_class之前调用一个方法,以便设置环境.所以:
class MyClass {
public:
MemberClass m_class;
MyClass(int xyz) {
do_something(); // this must happen before m_class is created
if(xyz == 42)
m_class = MemberClass(12);
else
m_class = MemberClass(32);
}
};
Run Code Online (Sandbox Code Playgroud)
是否有可能通过花哨的初始化列表技巧实现这一目标?
结构中的匿名结构中的Brace-or-equal-initializers不会对VS2013生成的输出执行任何操作.有代码:
#include <iostream>
#include <cstdint>
struct S
{
struct
{
uint64_t val = 0;
}anon;
};
int main()
{
S s;
S *a = new S;
std::cout << s.anon.val << std::endl;
std::cout << a->anon.val << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Linux上使用此命令编译:
g++ -std=c++11 def-init-anon-atruct.cpp -o def-init-anon-atruct
Run Code Online (Sandbox Code Playgroud)
(添加优化标志不会影响结果)
预期结果:
0
0
Run Code Online (Sandbox Code Playgroud)
奇怪的.使用VS2013运行它会产生垃圾值.在实施C++ 11标准方面,谁在这方面是正确的?我非常怀疑这是海湾合作委员会的错.
是否与一些无用的VS编译器选项有关?Windows扩展?由于MS制造的错误,我必须为结构制作默认构造函数?这很荒谬.
member-initialization c++11 anonymous-struct visual-c++-2013
我在自己的类中有一个A类成员,构造函数接受多个参数.我将我自己的类的参数转发给A类的构造函数.但重要的是这些参数是正确的,所以我需要在构建A的成员之前检查它们.并且继承问题:我可以省略成员中的成员初始化列表,有效地调用默认构造函数.在构造函数中检查之后,我可以在一个分配中调用A的构造函数.虽然,这会产生错误,因为A的析构函数是私有的.
我该如何解决这个问题?
MyClass::MyClass(int someParam) : otherMember(2){
//checks for someParam
member = A(someParam); // <- produces error
}
Run Code Online (Sandbox Code Playgroud) 我同意这样的共识,即通常最好在成员初始化列表中初始化C++数据成员而不是构造函数的主体,但我对此解释持怀疑态度
构建构造函数的另一种(低效)方法是通过赋值,例如:
Fred::Fred() { x_ = whatever; }.在这种情况下,表达式会导致创建单独的临时对象,并且此临时对象将传递到x_对象的赋值运算符中.然后该临时对象被破坏了;.那效率很低.
这实际上是对的吗?我原以为编译器会忽略默认构造的临时对象,该对象会立即被正文中的赋值所取代.我不知道为什么我预料到这一点,但阅读了上述说法,我想我已经悄悄地假设了多年.
成员初始化列表实际上更有效吗?如果是这样,是因为这个原因吗?
c++ performance constructor member-initialization assignment-operator
在(重新)实现一个简单的 constexpr 映射时,我写了这个(godbolt):
template <class key_type, class value_type, int N>
class flat_map
{
private:
struct pair
{
key_type key;
value_type value;
};
const pair elements[N];
public:
consteval flat_map(const pair (&arr)[N]) noexcept
: elements(arr) // works on gcc?!
{}
[[nodiscard]] consteval value_type operator[](const key_type key) const
{
for (const pair &elem : elements)
if (elem.key == key)
return elem.value;
throw "Key not found";
}
};
constexpr flat_map<int, char, 3> m = {{
{ 4, 'a' }, { -1, 'b' …Run Code Online (Sandbox Code Playgroud) c++ ×9
c++11 ×3
class ×3
constructor ×2
arrays ×1
c++14 ×1
c++20 ×1
consteval ×1
lambda ×1
performance ×1