标签: initialization-list

没有默认构造函数的类成员

假设我有一个没有默认构造函数的类A,一个返回类型A的对象的工厂方法factoryA,以及一个以A作为其成员的类B. 我知道在这种情况下,B类型A的成员必须在B的构造函数初始化列表中初始化.我并不完全清楚为什么如果有人可以向我解释这将是伟大的.另外,如果A的构造函数的参数需要在B的构造函数内部计算,比如通过查询数据库或那种性质的东西,该怎么办?有没有办法使用下面的设置,而不提供A与默认构造函数?提前致谢.

class A {
private:
  int _i;
public:
  A(int i) : _i(i) {} 
};

A factoryA(bool b) {
  if(b)
    return A(1);
  else return A(2);
}

class B {
private:
  A _a;
public:
  B(int j) {
    if(j > 0)
      _a = factoryA(true);
    else _a = factoryA(false);
  }
};
Run Code Online (Sandbox Code Playgroud)

c++ default-constructor initialization-list

6
推荐指数
3
解决办法
9353
查看次数

在构造函数的初始化列表中使用“this”对 Qt 特别危险吗?

我需要关于“这个”主题的可靠信息:

class MyClass, public QWidget
{
public:
    MyClass( QWidget * parent = NULL )
         :QWidget( parent ),
         mpAnotherWidget( new QWidget( this ) ){};
private:
    QWidget * mpAnotherWidget;
};
Run Code Online (Sandbox Code Playgroud)

当然,在构造函数或初始化列表中调用虚函数是一个坏主意。问题是:这个代码可以吗

mpAnotherWidget( new QWidget( this ) )
Run Code Online (Sandbox Code Playgroud)

导致未定义的行为?!如果是这样:为什么?

如果可以,请引用您的来源!谢谢!

c++ qt constructor this-pointer initialization-list

6
推荐指数
1
解决办法
682
查看次数

如何让一个变量依赖于一个类中的其他变量?

变量有什么问题international_standard_book_number?我怎样才能让它改变,无论何时isbn_field_i改变?

#include <iostream>
#include <string>

class ISBN
{
private:
  unsigned int isbn_field_1 = 0;
  unsigned int isbn_field_2 = 0;
  unsigned int isbn_field_3 = 0;
  char digit_or_letter = 'a';
  std::string international_standard_book_number =
    std::to_string(isbn_field_1) + "-" + std::to_string(isbn_field_2) + "-" +
    std::to_string(isbn_field_3) + "-" + digit_or_letter;

public:
  ISBN()
  {
    isbn_field_1 = 0, isbn_field_2 = 0, isbn_field_3 = 0, digit_or_letter = 'a';
  }
  ISBN(unsigned int a, unsigned int b, unsigned int c, char d)
  {
    isbn_field_1 = a, isbn_field_2 …
Run Code Online (Sandbox Code Playgroud)

c++ initialization-list c++17 default-initialization

6
推荐指数
2
解决办法
168
查看次数

用C++编写Prototype构造函数

我正在二次表达式,其中y=ax^2 + bx + ca,b,c是常数,x是一个变量.这是我的班级:

class quadratic {
public:
double evaluate(const double x);
void getCoefficients (double &A, double &B, double &C);
void setCoefficients (const double A, const double B, const double C);

private:
double a;
double b;
double c;
};
Run Code Online (Sandbox Code Playgroud)

我将为该类创建两个构造函数,以便以下是合法的

quadratic y1 = quadratic(1.0, -5.0, 7.0);
quadratic y2 = quadratic(-3.0, -2.0, 10.0);
quadratic y3;
Run Code Online (Sandbox Code Playgroud)

默认构造函数应设置为零,而第二个构造函数中的参数指示系数的初始值.

以下是我认为我应该这样做的方式:

quadratic()   //default values
{
double A, double B, double C = 0.0;
} …
Run Code Online (Sandbox Code Playgroud)

c++ constructor initialization-list

5
推荐指数
1
解决办法
4264
查看次数

构造函数中的初始化列表

我听说在构造函数中使用初始化列表的优点是不会有类型对象的额外副本.但是对于T类构造函数中的以下代码,它意味着什么?如果我评论分配并使用初始化列表会有什么区别?

#include <iostream>
using std::cout;
using std::endl;
using std::ostream;

class X {

public:

    X(float f_x = 0, float f_y = 0):x(f_x), y(f_y) {}


    ~X() {}

    X(const X& obj):x(obj.x), y(obj.y) {}

    friend ostream& operator << (ostream &os, X &obj);

private:
    float x;
    float y;
};

ostream& operator << (ostream &os, X &obj)
{ os << "x = " << obj.x << " y = " << obj.y; return os;}

class T {

public:

    T(X &obj) : x(obj) { /* x = …
Run Code Online (Sandbox Code Playgroud)

c++ constructor initialization-list

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

在C++中初始化构造函数初始化列表中的char数组

可以像这样使用初始化吗?

class Foo
{
public:
   Foo() : str("str") {}
   char str[4];
};
Run Code Online (Sandbox Code Playgroud)

还有这个?

int main()
{
   char str[4]("str");
}
Run Code Online (Sandbox Code Playgroud)

两者都给我gcc 4.7.2中的错误:

error:用作初始化程序的数组

Comeau编译两者.

c++ arrays class initialization-list

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

为什么非静态数据成员初始化器会破坏统一初始化语法?

如果所有类/结构数据成员都缺少初始化程序,则可以使用统一初始化语法来构造对象.

struct foo
{
    int i;
    float f;
};
...
foo bar{ 5, 3.141f };
Run Code Online (Sandbox Code Playgroud)

但是如果一个或多个成员具有初始化器,则统一初始化语法将变为无效.

struct foo
{
    int i;
    float f = 0;
};
...
foo bar{ 5, 3.141f };  // Compiler error.
Run Code Online (Sandbox Code Playgroud)

我猜测添加数据成员初始值设定项会自动实现一个或多个默认构造函数,并禁止构造函数的默认实现initialization_list.这是预期的标准吗?为什么这样工作?

c++ constructor initialization-list c++11

5
推荐指数
1
解决办法
338
查看次数

构造函数初始化列表中的循环依赖

以下是明确界定的吗?

class A;
class B;

// define A, which takes B& in constructor
// define B, which takes A& in constructor

class C
{
    A a;
    B b;
public:
    C() : a(b), b(a) { /* stuff with a and b */ }
}
Run Code Online (Sandbox Code Playgroud)

ideone.com上的完整示例.

是否安全/定义良好,只要构造函数对于它们所获得的引用A并且B不做任何操作?

c++ constructor initialization circular-dependency initialization-list

5
推荐指数
1
解决办法
471
查看次数

构造函数参数和同名成员

我很好奇以下代码是否有效。静态分析在此构造函数上给出错误。

总结:成员变量'A'是自己初始化的。

总结:成员变量'B'是自己初始化的。

总结:成员变量'C'是自己初始化的。

class Foo
{
public:
    Foo(int A, int B, int C);
private:
    int A;
    int B;
    int C;
}

Foo::Foo(int A, int B, int C) : 
A(A),
B(B),
C(C)
{}
Run Code Online (Sandbox Code Playgroud)

我知道这不是一个好的做法,可能应该改变,但是我想知道静态分析警告是否是误报并且成员变量是否会被正确初始化。

c++ oop language-lawyer initialization-list

5
推荐指数
1
解决办法
2770
查看次数

C++ 向量初始化列表与赋值

在 C++ 中,以下两种初始化向量的方法之间有什么技术区别?


    vector<int> v_1 {0, 1, 2};

    vector<int> v_2 = {3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

第一个是初始化列表。第二个是什么?

我很欣赏有关正确术语以及参考文档和不同标准版本(C++98 与 C++11)的提示。

c++ vector initialization-list

5
推荐指数
1
解决办法
1062
查看次数