繁体   English   中英

构造函数的默认公共和私有变量

[英]Constructor default-public and private variables

我知道Java并且我现在正在学习c ++。我比其他语言更容易学习它具有很多相同的东西。我的问题是在一本书的课上有完整的构造函数,但我在任何地方都没有面对默认的构造函数。构造函数,如果可以,我应该写它吗?此外,我还想测试什么,该类上有public:下面是变量,一段时间后有private:变量;下面是一些变量也像java的public和privates变量吗? 但是不要写private int numbers; 在C ++上我们编写

private:
int numbers;
int coffee;

我对吗?

很难确切地说出您的要求。 但是:1)如果您自己不创建任何构造函数,则会为您生成一个默认构造函数。 默认情况下是公开的。 2)生成的默认构造函数将按声明顺序(虚拟基数(如果有的话),深度先从声明的顺序,从右到左,然后按声明的左至右顺序的普通基数,默认构造基类和该类的成员,然后是成员变量(按声明顺序)。如果不能默认构造任何成员变量,则无法为您生成默认构造函数3)如果存在const成员或引用成员,或者没有默认构造函数的成员,或者您的类具有没有默认构造函数的基础,因此无法生成默认构造函数,因为这些成员必须使用一个或多个值进行初始化。 4)如果您定义了一个构造函数,并且还希望编译器为您生成一个默认构造函数,并且该默认构造函数在您的代码中有效,请执行以下操作:

class MyClass
{
public:
    MyClass() = default; // explicitly tell compiler to generate a default
    MyClass(int x) { ...} // normally would suppress gen of default ctor
};

如果我了解您有关访问说明的问题,它们就像标签,并且跟随它们的所有内容都具有访问说明,直到您编写另一个对其进行更改为止。 在类中,默认情况下,访问权限是私有的。 在结构中,访问是公共的。

希望这可以帮助。

至少可以说,您的老师正在标记不包括默认构造函数的事实很有趣。

作为通用原则,在Java和C ++中, 构造函数都负责将对象初始化为完全形成的状态。 之所以要使用默认构造函数,是因为可以在没有任何明确输入的情况下构造一个完整的对象。 但这可能会变得很奇怪:

//Java
public class Student {
    public String name;
    public int age;
    public Student() {
        this("", 0);
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

//C++
class Student {
public: //Everything after this point has 'public' access modifier; is like putting 
//'public' in front of each variable and method
    std::string name;
    int age;
    Student() : Student("", 0) {}
    Student(std::string name, int age) : name(std::move(name)), age(age) {}
};

在此示例中, Student具有一个构造函数,用于使用提供的值初始化该对象,以及一个默认构造函数,用于将对象初始化为具有空名称和年龄0。

但是想想: 这有意义吗? 一个有效的Student对象没有名称是否有意义,或者如果您不知道它们的名称,就可以构造一个Student对象吗? 暂时忘记功能要求(即,如果对象没有默认构造函数,则数组可能很难构造),逻辑上说,如果没有这样的输入就可以构造对象,这在逻辑上是不一致的。 根据您的用例, 没有默认构造函数可能更有意义。

因此,确定是否在代码中包含Default-Constructor是设计原则,与您使用Java还是C ++或大多数编程语言无关。

关于您的其他问题:

public:protected:private:与Java有不同的规则( publicprivate基本相同, protected是单数一出,C ++中不存在Java的default ,但可以通过使用来模拟friend关键字),但它们的行为易于识别:

class example {
//private:
//'class' declarations have everything 'private' by default, 'struct' makes things 'public' by default
    int val; //is private
    std::string type; //is private
public: //Will be public until another access modifier is used
    example() {} //is public
    example(int val, std::string type) : val(val), type(std::move(type)) {} //is public
    void do_something() { //is public
        private_function();
    }
private: //Will be private until another access modifier is used
    void private_function() { //is private
        val++;
    }
};

在Java中,您将编写如下相同的代码:

public class example {
    private int val;
    private String type;

    public example() {}
    public example(int val, String type) {
        this.val = val;
        this.type = type;
    }
    public void do_something() {
        private_function();
    }
    private void private_function() {
        val++;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM