在C ++中声明类的函数内部变量

时间:2013-07-24 11:01:58

标签: c++ class variables

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;
};

第一个正常。但第二个没有。如果我想选择第二种选择,我需要做什么?正确的代码和一些解释可能有所帮助。

6 个答案:

答案 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中的讨论