在 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】:

像这样在类的公共函数中声明变量有什么区别(thicknesslineType

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


通过将 thicknesslineType 放置在 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++ 中的类的函数内部声明变量的主要内容,如果未能解决你的问题,请参考以下文章

20165333 第五周学习总结

review07

20165225《Java程序设计》第五周学习总结

20165303第五周学习总结

days13--内部类与匿名内部类

20165212任胤第五周学习总结