class 和 cpp 核心指南中的初始化优先级变量?
Initialized priority variable in class and cpp core guidelines?
我使用了 C++ Core Checker nuget 和 运行 我的代码分析师我收到了这个警告
warning C26495: Variable 'Point::_x' is uninitialized. Always initialize a member variable. (type.6:
Point.h
class Point
{
private:
int _x;
int _y;
public:
Point();
Point(int x, int y) :_x(x), _y(y) {}
~Point();
void setX(int x)
{
_x = x;
}
void setY(int y)
{
_y = y;
}
int getX()
{
return _x;
}
int getY()
{
return _y;
}
}
Point.cpp
#include "Point.h"
Point::Point()
{
}
Point::~Point()
{
}
警告 C26495:变量 'Point::_x' 未初始化。我通过 make _x = 0 解决了这个问题。我的修复是否正确并且与指南相符?
在 C++11 标准中,您的修复是有效的解决方案。
来自 cppreference 文章:
Member initialization
非静态数据成员可以通过以下两种方式之一进行初始化:
1) 在构造函数的成员初始化列表中。
struct S
{
int n;
std::string s;
S() : n(7) // direct-initializes n, default-initializes s
{ }
};
2) 通过默认成员初始化器,它只是成员声明中包含的大括号或等于初始化器,如果成员在成员初始化器列表中被省略,则使用它
struct S
{
int n = 7;
std::string s{'a', 'b', 'c'};
S() // copy-initializes n, list-initializes s
{ }
};
并且您的解决方案使用了 2)
中使用的 equals 初始值设定项
在这两个选项之间进行选择:
1)in-class初始化(首选,可以默认默认构造函数)
class Point
{
private:
int _x{};
int _y{};
public:
Point() = default;
...
};
2) 委托构造函数(默认构造函数委托给接受 x 和 y 的构造函数)
class Point
{
private:
int _x;
int _y;
public:
Point() : Point(0, 0) {}
...
};
选项 1 更可取,因为您只写一次所有默认值,而不是在每个构造函数中。这在您的小 class 中可能没有什么不同,但如果您有更多的构造函数采用不同的参数,它就会有所不同。
我使用了 C++ Core Checker nuget 和 运行 我的代码分析师我收到了这个警告
warning C26495: Variable 'Point::_x' is uninitialized. Always initialize a member variable. (type.6:
Point.h
class Point
{
private:
int _x;
int _y;
public:
Point();
Point(int x, int y) :_x(x), _y(y) {}
~Point();
void setX(int x)
{
_x = x;
}
void setY(int y)
{
_y = y;
}
int getX()
{
return _x;
}
int getY()
{
return _y;
}
}
Point.cpp
#include "Point.h"
Point::Point()
{
}
Point::~Point()
{
}
警告 C26495:变量 'Point::_x' 未初始化。我通过 make _x = 0 解决了这个问题。我的修复是否正确并且与指南相符?
在 C++11 标准中,您的修复是有效的解决方案。
来自 cppreference 文章:
Member initialization
非静态数据成员可以通过以下两种方式之一进行初始化:
1) 在构造函数的成员初始化列表中。
struct S
{
int n;
std::string s;
S() : n(7) // direct-initializes n, default-initializes s
{ }
};
2) 通过默认成员初始化器,它只是成员声明中包含的大括号或等于初始化器,如果成员在成员初始化器列表中被省略,则使用它
struct S
{
int n = 7;
std::string s{'a', 'b', 'c'};
S() // copy-initializes n, list-initializes s
{ }
};
并且您的解决方案使用了 2)
中使用的 equals 初始值设定项在这两个选项之间进行选择:
1)in-class初始化(首选,可以默认默认构造函数)
class Point
{
private:
int _x{};
int _y{};
public:
Point() = default;
...
};
2) 委托构造函数(默认构造函数委托给接受 x 和 y 的构造函数)
class Point
{
private:
int _x;
int _y;
public:
Point() : Point(0, 0) {}
...
};
选项 1 更可取,因为您只写一次所有默认值,而不是在每个构造函数中。这在您的小 class 中可能没有什么不同,但如果您有更多的构造函数采用不同的参数,它就会有所不同。