我知道Java,我现在学习C ++。我比其他语言更容易学习它,它有很多相同的东西。我的问题是在一本书的课堂上有一个完整的构造函数,但我没有在任何地方面对默认构造函数。有c ++默认构造函数,如果是的话,我应该写吗?除此之外,我想测试一些东西,在这个类中,它有public:
和向下有变量,一段时间后有private:
和向下也有一些变量。像Java公共和私有变量吗?但是我们不是在 C++ 上写private int numbers;
,而是写
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不同(public
和private
大多相同,protected
是奇数,Java的default
在C++中不存在,但可以通过使用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++;
}
}