标签: member-initialization

如果不明确地执行C++类成员,它是如何初始化的?

假设我有私人承包商,客人一类ptr,name,pname,rname,crnameage.如果我自己不初始化会怎么样?这是一个例子:

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中初始化成员?指针会发生什么?做stringint获得0 intialized默认构造函数string()int()?参考会员怎么样?const引用怎么样?

我还应该知道什么?

有谁知道涵盖这些案例的教程?也许在一些书中?我可以在大学的图书馆访问很多C++书籍.

我想学习它,所以我可以编写更好的(无bug)程序.任何反馈都会有帮助!

c++ initialization member-initialization

137
推荐指数
6
解决办法
9万
查看次数

阵列成员可以自我引用初始化吗?

考虑以下代码,我们在其中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)

以上程序定义明确吗?我们可以安全地使用同一阵列的一部分来初始化它的另一部分吗?

c++ array-initialization member-initialization c++11

22
推荐指数
2
解决办法
572
查看次数

从全局变量初始化静态成员时“无效使用非静态数据成员”

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)

是什么导致了这个错误?

c++ static-members member-initialization

19
推荐指数
1
解决办法
3133
查看次数

在默认的初始化程序gcc vs clang中使用lambda

#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捕获进行略微修改的定义也适用于全局或局部范围.

哪个编译器是对的?

c++ lambda member-initialization language-lawyer c++14

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

什么是C++ 11中的"成员初始化程序"?

我遇到了一个名为"member initializer"的奇怪概念.

这里说:

C++ 11添加了成员​​初始化器,如果构造函数没有初始化成员本身,则表达式将应用于类范围内的成员.

它的定义是什么?

是否有一些例子来说明它的用法?

c++ class member-initialization c++11

13
推荐指数
2
解决办法
5751
查看次数

有条件地初始化C++成员变量的正确方法?

我确信这是一个非常简单的问题.以下代码显示了我正在尝试执行的操作:

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)

是否有可能通过花哨的初始化列表技巧实现这一目标?

c++ class member-initialization

11
推荐指数
3
解决办法
9338
查看次数

匿名结构中的Brace-or-equal-initializers在VS2013上不起作用

结构中的匿名结构中的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

9
推荐指数
2
解决办法
272
查看次数

在初始化列表之前执行检查

我在自己的类中有一个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++ constructor class member-initialization

7
推荐指数
1
解决办法
982
查看次数

成员初始化列表真的更有效吗?

我同意这样的共识,即通常最好在成员初始化列表中初始化C++数据成员而不是构造函数的主体,但我对此解释持怀疑态度

构建构造函数的另一种(低效)方法是通过赋值,例如:Fred::Fred() { x_ = whatever; }.在这种情况下,表达式会导致创建单独的临时对象,并且此临时对象将传递到x_对象的赋值运算符中.然后该临时对象被破坏了;.那效率很低.

这实际上是对的吗?我原以为编译器会忽略默认构造的临时对象,该对象会立即被正文中的赋值所取代.我不知道为什么我预料到这一点,但阅读了上述说法,我想我已经悄悄地假设了多年.

成员初始化列表实际上更有效吗?如果是这样,是因为这个原因吗?

c++ performance constructor member-initialization assignment-operator

7
推荐指数
2
解决办法
800
查看次数

gcc 允许使用另一个数组引用初始化 const 数组成员是错误的吗?

在(重新)实现一个简单的 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++ arrays member-initialization c++20 consteval

7
推荐指数
2
解决办法
813
查看次数