标签: ctor-initializer

构造函数中这个奇怪的冒号成员(":")语法是什么?

最近我见过如下例子:

#include <iostream>

class Foo {
public:
  int bar;
  Foo(int num): bar(num) {};
};

int main(void) {
  std::cout << Foo(42).bar << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这奇怪: bar(num)意味着什么?它似乎初始化成员变量,但我以前从未见过这种语法.它看起来像一个函数/构造函数调用,但对于一个int?对我没有任何意义.也许有人可以启发我.而且,顺便说一下,还有其他类似的深奥语言功能,你永远不会在一本普通的C++书中找到它吗?

c++ syntax constructor c++-faq ctor-initializer

325
推荐指数
11
解决办法
10万
查看次数

const引用类成员是否延长了临时生命?

为什么这样:

#include <string>
#include <iostream>
using namespace std;

class Sandbox
{
public:
    Sandbox(const string& n) : member(n) {}
    const string& member;
};

int main()
{
    Sandbox sandbox(string("four"));
    cout << "The answer is: " << sandbox.member << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

答案是:

代替:

答案是:四

c++ temporary const-reference ctor-initializer

157
推荐指数
3
解决办法
4万
查看次数

在构造函数初始值设定项中初始化成员数组

class C 
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};
Run Code Online (Sandbox Code Playgroud)

我相信原因是数组只能用=语法初始化,即:

int arr[3] = {1,3,4};
Run Code Online (Sandbox Code Playgroud)

问题

  1. 我该怎么做我想做的事情(也就是说,在构造函数中初始化一个数组(不在主体中分配元素)).它甚至可能吗?
  2. C++ 03标准是否对在ctor初始化器中初始化聚合(包括数组)有什么特别之处?或者上述代码的无效性是其他一些规则的必然结果?
  3. C++ 0x初始化列表是否解决了这个问题?

PS请不要提及矢量,boost ::数组,以及它们对数组的优越性,我很清楚.

c++ initializer-list ctor-initializer aggregate-initialization c++11

92
推荐指数
3
解决办法
14万
查看次数

使用委托构造函数时的成员初始化

我已经开始尝试C++ 11标准,我发现这个问题描述了如何从同一个类中的另一个ctor调用你的ctor以避免使用init方法等.现在我正在使用看起来像这样的代码尝试相同的事情:

HPP:

class Tokenizer
{
public:
  Tokenizer();
  Tokenizer(std::stringstream *lines);
  virtual ~Tokenizer() {};
private:
  std::stringstream *lines;
};
Run Code Online (Sandbox Code Playgroud)

CPP:

Tokenizer::Tokenizer()
  : expected('=')
{
}

Tokenizer::Tokenizer(std::stringstream *lines)
  : Tokenizer(),
    lines(lines)
{
}
Run Code Online (Sandbox Code Playgroud)

但是这给了我错误: In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegation我已经尝试先移动Tokenizer()部分,然后在列表中移动,但这并没有帮助.

这背后的原因是什么,我应该如何解决?我尝试lines(lines)this->lines = lines;相反的方式移动到身体,它工作正常.但我真的希望能够使用初始化列表.

提前致谢!

c++ gcc ctor-initializer c++11

87
推荐指数
1
解决办法
3万
查看次数

C++构造函数名后的冒号是做什么的?

冒号运算符(":")在这个构造函数中做了什么?它等同于MyClass(m_classID = -1, m_userdata = 0);

class MyClass {
public:

    MyClass() : m_classID(-1), m_userdata(0) { 
    }

    int m_classID;
    void *m_userdata;
};
Run Code Online (Sandbox Code Playgroud)

c++ constructor initialization-list ctor-initializer

85
推荐指数
2
解决办法
5万
查看次数

如何在构造函数中初始化const字段?

想象一下,我有一个C++类Foo和一个类Bar,它必须用一个构造函数创建,其中传递一个Foo指针,这个指针意味着在Bar实例生命周期中保持不变.这样做的正确方法是什么?

事实上,我认为我可以像下面的代码一样编写,但它不能编译..

class Foo;

class Bar {
public:
    Foo * const foo;
    Bar(Foo* foo) {
        this->foo = foo;
    }
};

class Foo {
public:
  int a;
};
Run Code Online (Sandbox Code Playgroud)

任何建议都是受欢迎的.

c++ constructor const ctor-initializer

66
推荐指数
4
解决办法
7万
查看次数

成员初始化列表中的递增是否会生成未定义的行为?

这会导致未定义的行为吗?具体来说,初始化列表中的递增以及如何评估.

class Wrinkle {
public:
    Wrinkle(int i) : a(++i), b(++i), x(++i) {}
private:
    int a;
    int x;
    int b;
};
Run Code Online (Sandbox Code Playgroud)

成员声明和初始化程序列表之间的顺序差异是有意的,因为这是一个可以准确显示该差异的示例,因此请暂时忽略它.

c++ undefined-behavior language-lawyer ctor-initializer

24
推荐指数
2
解决办法
1247
查看次数

构造函数中冒号后的变量

我还在学习C++并试图理解它.我正在查看一些代码并看到:

point3(float X, float Y, float Z) :
x(X), y(Y), z(Z)  // <----- what is this used for
{
}
Run Code Online (Sandbox Code Playgroud)

位于构造函数参数旁边的"x(X),y(Y),z(Z)"是什么意思?

c++ constructor ctor-initializer

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

构造函数的初始化列表中的'this'指针

我想我无法理解为什么这不起作用.我一直以为我可以在构造函数中使用'this'指针,但我从来不知道我不能在初始化列表中使用'this'.

#include <iostream>

class A {
    public:
        int a;
        int b;
        A(int a = 0, int b = 0) : this->a(a), this->b(b) { }
        void print() {
        std::cout << a << ", " << b << std::endl;
    }
};

int main() {
    A a;
    a.print();
}
Run Code Online (Sandbox Code Playgroud)

我很想知道与之相关的细节.

c++ this syntax-error language-lawyer ctor-initializer

21
推荐指数
2
解决办法
2191
查看次数

初始化列表中的依赖关系

这种行为定义明确吗?

class Foo
{
    int A, B;

    public:

    Foo(int Bar): B(Bar), A(B + 123)
    {
    }
};

int main()
{
    Foo MyFoo(0);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ initialization standards-compliance undefined-behavior ctor-initializer

18
推荐指数
2
解决办法
1707
查看次数