在 C++ 中的类的函数内部声明变量
Posted
技术标签:
【中文标题】在 C++ 中的类的函数内部声明变量【英文标题】:Declaring variable inside functions of a class in C++ 【发布时间】:2013-07-24 11:01:57 【问题描述】:MyFill 是一个类,MyFill2 是该类中的一个函数。
像这样在类的公共函数中声明变量有什么区别(厚度和线型)-->
MyFill::MyFill (Mat img, Point center)
MyFill2 (img, center);
void MyFill::MyFill2(Mat img, Point center)
int thickness = -1;
int lineType = 8;
circle (
img,
center,
w/32,
Scalar( 0, 0, 255 ),
thickness,
lineType
);
...只是在私有标签(private:) 中声明它们,就像在头文件中一样 -->
class MyFill
public:
MyFill(Mat img1, Point center1);
void MyFill2 (Mat img, Point center);
private:
int thickness = -1;
int lineType = 8;
;
第一个工作正常。但第二个没有。如果我想选择第二个选项,我需要做什么?带有一些解释的正确代码可能会有所帮助。
【问题讨论】:
@umläute:我收到一个错误:只有静态 const 整数数据成员可以在类中初始化 【参考方案1】:你不能在类的范围内给变量赋值,你只能在函数内部或者全局范围内这样做。
class MyFill
public:
MyFill(Mat img1, Point center1);
void MyFill2 (Mat img, Point center);
private:
int thickness;
int lineType;
;
您的标题需要更改为上述内容。然后,您可以在任何您喜欢的函数中设置值,最好是像这样的构造函数:
MyFill::MyFill(Mat img1, Point center1)
thickness = -1;
lineType = 8;
编辑 - 在 cmets 中回答您的问题:
函数参数中变量名的标识符在声明和定义之间不需要匹配,只需要匹配类型和它们的顺序。它使它更清楚,但它不是必需的。
一个函数原型实际上只被视为如下:
void MyFill2(Mat, Point);
当你给它一个定义时,这就是标识符的分配真正重要的时候:
void MyFill2(Mat m, Point p)
//....
【讨论】:
billz上面说的不是矛盾吗? “通过将粗细和 lineType 放在类范围内,它们是 MyFill 类的成员,并且在所有 MyFill 对象中都可用。” @ridctg 构造函数中的那些变量仍然在类范围内。它们刚刚被初始化,因此:.它们不是本地范围。对不起,我不明白这个问题:( 谢谢。我需要更多信息。我在这里得到的每个答案都使用了“MyFill(Mat img1, Point center1); void MyFill2 (Mat img, Point center);”但我正在使用“MyFill(Mat img1, Point center1); void MyFill2 (Mat img, Point center);”它仍然有效。但我想知道哪个是正确的以及为什么。 @ridctg 一个是构造函数,另一个只是具有相同参数的函数。它们都是正确的,将它们都放在课堂上绝对没有错。 @ridctg 我想我明白你现在在说什么。函数参数中变量名的标识符不需要在声明和定义之间匹配,只需要匹配类型和它们的顺序。【参考方案2】:像这样在类的公共函数中声明变量有什么区别(thickness和lineType)
thickness 和 lineType 在函数作用域中定义,称为 MyFill2 函数的局部变量。
void MyFill::MyFill2(Mat img, Point center)
int thickness = -1; // thickness is a local variable in MyFill2,
// it's destroyed when MyFill2 function goes out of scope
// thickness is not accessable in any other member function of MyFill
// or object.
int lineType = 8; // same here
通过将 thickness 和 lineType 放置在 class scope 中,它们是 MyFill 类的成员,并且在所有 MyFill 对象中都可用。
class MyFill
private:
int thickness = -1; // this is a C++11 form of initialize class member.
// In C++03, you need to initialize them in constructor
// thickness is a member of MyFill, it will exist in all life of MyFill object.
int lineType = 8;
;
在 C++03 中,你可以在成员初始化列表中初始化类成员
MyFill::MyFill(Mat img1, Point center1)
: thickness(0), lineType(0) // Initializer list to initialize the member variables
希望这能回答你的问题。
【讨论】:
谢谢。我想这就是答案。我现在就去试试。 @ridctg 没问题,很高兴它有帮助。【参考方案3】:您在类定义中声明成员变量,然后在构造函数中使用初始化列表来初始化成员变量:
class MyFill
public:
MyFill(Mat img1, Point center1);
void MyFill2 (Mat img, Point center);
private:
// Just declare the member variables
int thickness;
int lineType;
;
// ...
MyFill::MyFill(Mat img1, Point center1)
: thickness(-1), lineType(8) // Initializer list to initialize the member variables
MyFill2(img1, center1);
【讨论】:
由于C++11在类声明中的初始化也是可能的。 Initializer list... 我想这就是我需要使用的。谢谢@Joachim @soon:我正在使用 VS2010。这就是我收到错误的原因吗? @ridctg,也许吧。我不使用 MSVC,所以我无法告诉你它支持哪些 C++11 功能。【参考方案4】:你不能在类声明中赋值值。 你应该在你的类的 constructor 中这样做:
class MyFill
public:
MyFill(Mat img1, Point center1);
private:
int thickness ;
int lineType;
;
MyFill::MyFill(Mat img1, Point center1) : thickness(-1), lineType(8)
// ...
【讨论】:
请注意,从 C++11 开始,您可以在类声明中初始化类成员。 感谢 umläute 很快! @ridctg 很乐意提供帮助,但请注意,*** 政策不鼓励thank you 发帖。【参考方案5】:在前一种情况下,您声明的局部变量仅在函数范围内有效。在外面,你不能使用它们。
在后者中,您为类的范围声明了它们,因此您可以在该类的任何函数中引用它们。
请注意,您的初始化风格只有在您使用符合 C++11 的编译器时才有效,而对于 C++03,您需要在构造函数中初始化它们:
MyFill::MyFill(Mat img1, Point center1)
: thickness(-1), lineType(8)
/* ... */
并且只将它们声明为
private:
int thickness;
int lineType;
如果您只在一个函数中需要这些变量,请使用局部变量。
【讨论】:
谢谢...这个答案很常见,我要试试【参考方案6】:c++11允许在类声明中初始化非const和非静态成员,可以参考page中的讨论
【讨论】:
以上是关于在 C++ 中的类的函数内部声明变量的主要内容,如果未能解决你的问题,请参考以下文章