MyFill 是一个类, MyFill2 是该类中的一个函数。
在类的公共函数内声明变量之间的区别是什么(厚度和lineType) - >
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
);
}
...只是在私人标签(私人:)中声明它们,就像在头文件中一样 - >
class MyFill {
public:
MyFill(Mat img1, Point center1);
void MyFill2 (Mat img, Point center);
private:
int thickness = -1;
int lineType = 8;
};
第一个正常。但第二个没有。如果我想选择第二种选择,我需要做什么?正确的代码和一些解释可能有所帮助。
答案 0 :(得分:5)
不允许为类范围内的变量赋值,只能在函数内部或全局范围内执行此操作。
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;
}
编辑 - 在评论中提问:
函数参数中变量名的标识符不需要在声明和定义之间匹配,只需要匹配类型及其顺序。它使它更清晰,但不是必需的。
函数原型实际上只被视为以下内容:
void MyFill2(Mat, Point);
当你给它一个定义时,那就是标识符的分配真的很重要:
void MyFill2(Mat m, Point p)
{
//....
}
答案 1 :(得分:2)
您在类定义中声明成员变量,然后在构造函数中使用初始化列表来初始化成员变量:
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);
}
答案 2 :(得分: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
}
通过在类范围中放置厚度和 lineType ,它们是MyFill类的成员,并且它们在所有MyFill对象中都可用。< / p>
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
{
}
希望这能回答你的问题。
答案 3 :(得分:1)
你不能在类声明中分配值。 你应该在你班级的构造函数中做到这一点:
class MyFill {
public:
MyFill(Mat img1, Point center1);
private:
int thickness ;
int lineType;
};
MyFill::MyFill(Mat img1, Point center1) : thickness(-1), lineType(8) {
// ...
}
答案 4 :(得分:1)
在前一种情况下,您声明仅在函数范围内有效的局部变量。在外面,你不能使用它们。
在后者中,您为类的范围声明了它们,因此您可以在该类的任何函数中引用它们。
请注意,只有在使用符合C ++ 11的编译器时,您的初始化样式才有效,而C ++ 03则需要在构造函数中初始化它们:
MyFill::MyFill(Mat img1, Point center1)
: thickness(-1), lineType(8)
{ /* ... */ }
并且只将它们声明为
private:
int thickness;
int lineType;
如果您只需要在这一个函数中使用这些变量,请使用局部变量。
答案 5 :(得分:0)
c ++ 11允许在类声明中初始化非const和非静态成员,你可以参考这个page中的讨论